Gruppenchat: Über HTTPS oder nicht?

eMSch

Mitglied
Guten Tag

Ich möchte eine Art Gruppenchat entwickeln, so ähnlich wie z.B. die Gruppen bei Telegram oder WhatsApp, das Augenmerk liegt aber eher auf Sprachnachrichten.
Als Backend habe ich mich nun für eine Serverapplikation in Java entschieden, die Clients auf Android/iOS/WindowsPhone dann in der entsprechenden Sprache.

Der Punkt, an dem ich noch rätsel ist, wie genau ich die Kommunikation zwischen der Client-App und dem Server gestalten soll. Ich würde es eigentlich schon gerne verschlüsseln, bin mir da aber nicht ganz sicher, was die eleganteste/beste Möglichkeit wäre.
Möglichkeit 1: Eigene Packets des Protokolls werden per TCP verschickt, und der Payload wird mit AES oder dergleichen verschlüsselt.

Möglichkeit 2: Ich setze mein Protokoll auf HTTPS-Basis auf und die Packets werden ohne weitere Verschlüsselung durch den "verschlüsselten HTTPS Tunnel" geschickt.​

Möglichkeit 2 wäre ja eine End-to-end Verschlüsselung, richtig?
Aber ist es überhaupt sinnvoll ein Protokoll auf HTTP aufzubauen?

Ich freue mich auf eure Ideen und Ratschläge, bei Unklarheiten bitte nachfragen.
MFG
 

Tobse

Top Contributor
Wenn du auf HTTPS (und damit auf HTTP) aufsetzt hast du einen ziemlichen overhead (ist schlecht für die Datenflatrate).
Du kannst aber durchaus das SSL-Protokoll nutzen, das wäre dann fast das gleiche wie die Verschlüsselung selbst zu implementieren nur eben Standardkonform.

ACHTUNG: Eine End-To-End verschlüsselung ist beides nicht, da ja nur die Verbindung verschlüsselt ist. Der Server kann die Nachrichten lesen. Jeder, der das Passwort eines Benutzers kennt kann sich als dieser ausgeben und die Nachrichten mitlesen (und auch selbst welche verschicken!).
Für eine Sichere End-To-End-Verschlüsselung brauchst du asymmetrische Kryptographie und viel Fachwissen denn schon der kleinste Fehler macht dein ganzes System undicht wie ein Sieb. Wenn du also keine fundierten Kenntnisse zu Verschlüsselung hast, eigne sie dir an, bevor du beginnst, Kryptographie einzusetzen. Klassen wie ein SSLSocket kannst du natürlich auch ohne Fachwissen nutzen, da dort ja Java alles kritische erledigt.
 

eMSch

Mitglied
Ah, danke, das hat meine Verwirrung beseitigt. Verschlüsselung soll kein Hauptkonzept der Anwendung werden, daher verschiebe ich das dann auf später.
Jedoch habe ich dann jetzt noch eine Frage: Wie verschicke und empfange ich die (Audio)Nachrichten am besten?
Ich habe zwar Erfahrung mit Streams und Server/Client Systemen in C#, jedoch habe ich mit Java noch nicht in diesem Gebiet gearbeitet, und die verschiedenen Klassen verwirren mich noch ein wenig.
Mein derzeitiger Ansatz sieht so aus:
Senden (Auf Android)
  • Audionachricht mit
    Code:
    MediaRecorder
    aufnehmen und abspeichern
  • Datei in ein ByteArray umwandeln
  • Verbindung zum Server herstellen
  • Ein Byte versenden mit der Information, um was für eine Nachricht es sich handelt(Text/Voice)
  • Danach die Länge der Nachricht in bytes senden
  • Letztlich die Nachricht an sich verschicken

Mein Code sieht derzeitig so aus:
Java:
        File f = new File(outputFile); //Aufgenommene Audiodatei
        byte[] fileArray = fileToByteArray(f);

        Socket socket = null;
        String host = "192.168.2.112";

        socket = new Socket(host, 32555);

        BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());

        out.write(1);
        out.write(ByteBuffer.allocate(4).putInt(fileArray.length).array());
        out.write(fileArray);
        
        out.flush();
        out.close();
        socket.close();

Kann man das so machen oder gibt es da elegantere Lösungen?
 

Tobse

Top Contributor
Das ist vom Grundsatz her mal nicht falsch. Bedenke allerdings: deine Anwendung läuft nachher auf einem Handy oder Tablet mit teilweise nur 256MB ram. So eine Audionachicht kann leicht mal 1MB groß werden. Das komplett in den RAM zu laden ist demnach auf einem Handy ziemlich schlecht. Für Genau dieses Problem benutze ich immer folgende Hilfsmethode:

Java:
    public static void writeFile(File source, OutputStream dest)
        throws IOException
    {
        writeFile(source, dest, null);
    }

    // ProgressListener ist nur ein Hilfsinterface für Feedback zum Fortschritt (um etwa eine JProgressBar mit Infos zu einem Upload zu versorgen 
    // wenn du diese Funktionalität nicht brauchst entferne einfach die entsprechenden Zeilen und den Parameter
    public static void writeFile(File source, OutputStream dest, ProgressListener l)
        throws IOException
    {
        byte[] buffer = new byte[4096];
        long done = 0;
        long size = source.length();
        FileInputStream in = new FileInputStream(source);
        if (l != null)
        {
            l.processStarted(0, (int) size);
        }
        while (done < size)
        {
            Thread.yield();
            int read = in.read(buffer);
            if (read == -1)
            {
                break;
            }
            dest.write(buffer, 0, read);
            done += read;
            if (l != null)
            {
                l.processStateChange((int) done);
            }
        }
        if (l != null)
        {
            l.processFinished();
        }
        in.close();
    }
 

eMSch

Mitglied
Sehr sehr schön, ich glaube das ist genau das, was ich brauche. Vielen Dank dafür.
Würde dir ja auch gerne ein "Danke" geben, aber ich finde keinen Button o.ä. :D
 

Tobse

Top Contributor
Es kann sein, dass man den Danke-Button erst ab einer bestimmten Zahl von Beiträgen sieht. Aber eigentlich sollte er neben dem Zitieren, unten rechts, sein ;) Aber wie dem auch sei - deine Botschaft kam ja bei mir an :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Socket Über UDP Objekte verschicken Netzwerkprogrammierung 9
X Über eine Socket-Verbindung Arrays übergeben Netzwerkprogrammierung 5
C Über welchen Netzwerkadapter kommt mein receive? Netzwerkprogrammierung 15
R Über Java anderen Gateway nutzen Netzwerkprogrammierung 10
DeviAn Über ein Linux Server ein Windows Server nach einer File fragen Netzwerkprogrammierung 6
D FTP Über URLConnection Netzwerkprogrammierung 7
O Über Socket Array versenden Netzwerkprogrammierung 5
N Über Socket an Linux-Server Kommandos absetzen? Netzwerkprogrammierung 4
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
Thallius HTTP Kann man den Raw HTTPS Request irgendwie ausgeben lassen? Netzwerkprogrammierung 6
G localhost im Backend https vs. http Netzwerkprogrammierung 9
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
M HTTPS Login & etwas posten Netzwerkprogrammierung 0
M Proxy und HTTPS Netzwerkprogrammierung 3
Thallius HTTP HTTPS unter Java 1.6 schlägt fehl Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
GENiALi Grizzly mit HTTPS Netzwerkprogrammierung 0
N Hintergrundlogin HTTPs Webform Netzwerkprogrammierung 5
K HTTPS Zertifikat Netzwerkprogrammierung 3
F C/S über HTTPS Netzwerkprogrammierung 2
NoXiD Java mit HTTPS verbinden Netzwerkprogrammierung 6
T Up- und Download mit https Netzwerkprogrammierung 14
M HTTP HTTPS-Verbindung mittels Java und Javascript Netzwerkprogrammierung 2
T HTTPS einloggen Netzwerkprogrammierung 9
L Https Verbindung wird aus jar heraus nicht aufgebaut Netzwerkprogrammierung 12
E HTTPS Debuggen (verschlüsselte Daten anzeigen)? Netzwerkprogrammierung 12
Q HTTPS mit Apache HttpClient Netzwerkprogrammierung 4
M HTTPS Seiten runterladen Netzwerkprogrammierung 2
C HTTPS mit Apache HTTPClient Netzwerkprogrammierung 1
A HTTPS-Request via Proxy mit Konfigurationsskript Netzwerkprogrammierung 3
P HTTPS - öffentliches Zertifikat - ermitteln Netzwerkprogrammierung 5
G file download über https mit p12 Zertifikat Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben