# End zu End verschlüsseln?



## leon_20v (3. Aug 2014)

Hallo zusammen,

ich entwickle schon ne ganze weile Software und steh mal wieder vor einer neuen Aufgabe, die ich noch nie gemacht habe. 

Ich würde gern zwei Programme schreiben, die eine Verbindung aufbauen und darüber Daten austauschen können. Also typisches Server/Client.

Eigentlich möchte ich hier einen Tunnel zwischen den Programmen aufbauen, aber ich weiß nicht wie ich das bewerkstelligen soll. TCP ist ja auf ner ganz anderen Ebene, also muss ich drüber irgendwie die Daten verschlüsseln. Wenn ich die Daten vor dem Senden verschlüsseln würde, dann würde da viel zu viel CPU drauf gehen. Das muss doch irgendwie wie ein Tunnel funkionieren??

Leider habe ich in der Schule nicht richtig aufgepasst und es ist auch schon zu lange her. Ich weiß an dieser stelle nicht so richtig nach was ich suchen soll.  Ich hoffe ihr könnt mir weiterhelfen.


----------



## Thallius (3. Aug 2014)

Wieso soll den eine Verschlüsselung mehr CPU brauchen als ein Tunnel? Was meinst du den wohl was ein Tunnel macht?

Gruss

Claus


----------



## leon_20v (3. Aug 2014)

Ja ich weiß ned so genau, in meinem Studium hab ich an der Stelle ned genau aufgepasst. Ich hab zwar in nem vyetta router nen tunnel mit ipsec aufgebaut, aber keine ahnung was da genau passiert. ist die cpu des vyetta routers nicht viel zu lahm um den ganzen verkehr zu verschlüsseln? anscheinend nicht?


----------



## lawila (4. Aug 2014)

nehmen wir doch als beispiel mal SMTP

SMTP kennt drei arten : plain, SSL-tunnel und STARTTLS

plain : ungesicherte direkt-verbindung, jeder kann daten lesen und manipulieren

SSL-tunnel : hier werden die ungesicherten daten durch einen gesicherten tunnel übertragen

STARTTLS : hier werden die gesicherten daten über einen ungesicherten kanal übertragen


was ist jetzt genau der unterschied ?

zu plain brauchen wir nichts weiter sagen ... ganz normale ungesicherte plain-verbindung halt

zum SSL-tunnel

wie funktioniert ein tunnel ? was macht er ? wie verhält er sich zur anwendung ?

nun, wichtig ist zu erwähnen das ein tunnel in der regel transparent gegenüber der anwedung ist, die anwendung also selbst nicht weis / merkt das ihre eigentlich ungesicherte verbindung durch einen (SSL-)tunnel geht

was passiert dabei genau ?
nun, eigentlich nicht sonderlich viel
die anwendung baut eine ungesicherte verbindung zur gegenstelle auf, handelt mit dieser gewisse parameter für den ssl-tunnel aus und überträgt dann die daten darüber

das läuft dann in java so ab das wenn der tunnel steht (sog. handshake) die daten anstatt direkt auf den stream zu schreiben in den tunnel geschrieben werden der dann seinerseits die daten verschlüsselt und auf den stream rausschreibt

es ist also ein für die anwendung normalerweise transparentes bindeglied was letzten endes "zwischen drin" sitzt und die daten halt sichert



zum STARTTLS

TLS funktioniert (zumindest bei SMTP) ganz anders
anstatt am anfang der verbindung die parameter für einen tunnel auszuhandeln und dann alles über diesen gesichert zu übertragen wird erstmal ne ganz normale plain-verbindung aufgebaut
über diese offene verbindung werden dann parameter für die TLS-sitzung ausgehandelt und anschließden daruf umgestellt

hierbei ist dann TLS für die anwendung nicht mehr transparent sondern sie weis ganz genau das hier verschlüsselt wird und muss sich auch selbst darum kümmern

hierbei werden also die daten erst durch einen zwischenschritt bewusst gesichert und dann in den unsicheren kanal geschrieben



beides nimmt in etwa die gleiche rechenzeit in anspruch ... man muss sich bei gewissen protokollen nur gedanken über den eventuellen overhead machen ... was aber auch erst ab einer bestimmten datengröße relevant wird wenn man sich mal die geschwindigkeit moderner privat-anschlüsse betrachtet




kurz um : ob du jetzt in deiner anwendung selbst einen ende-zu-ende code einbaust ... oder dein router n IPsec-tunnel zu nem server hält ... eigentlich völlig egal ... nur das der router ggf wirklich performance-probleme bekommen könnte ... was moderne PCs nicht hätten


----------



## leon_20v (4. Aug 2014)

Okay vielen Dank für deine ausführliche Antwort.

Da ich ja den Datenverkehr nicht erst ab dem Router sondern direkt zwischen den Programmen verschlüsseln möchte, habe ich mich für TLS enschieden.


Ich habe schon ein paar Librarys gefunden, aber die meisten sind GNU. Ich find nichts dazu das JDK was dazu anbietet?


----------



## lawila (4. Aug 2014)

nun ... der unterschied zwischen SSLv3 und SSLv3.x/TLS bezüglich SMTP war vielleicht doch nicht so das beste beispiel

grundsätzlich : wenn man schon SSL nutzt sollte man auch entsprechend dessen aktuellest version 3.x nutzen ... welche als TLS bezeichnet wird
oder andersrum : TLS ist SSL, nur halt die aktuelle version 3.x

und bezüglich fremd-libs : brauchst du nicht, java selbst bringt alles mit was man dafür braucht

ob man einen SSL-Socket nutzt (wäre dann übertragen auf SMTP der tunnel) oder sich selbst die mühe macht und über einen normalen socket überträgt (würde bei SMTP der aktuellen STARTTLS-variante entsprechen) bleibt jedem selbst überlassen

man sollte jedoch in die überlegung mit einbeziehen wo man welchen overhead hat und ob eine andere lösung nicht mehr sinn macht
aber natürlich dabei auch auf die sicherheit achten

klar kann man SSL selbst implementieren und dabei so den einen oder anderen fehler in der aktuellen lib ausmerzen, aber bei eigenen-implementierungen ergeben sich häufig noch weit aus gravierendere sicherheitslücken als in einer fertigen lib


----------



## leon_20v (4. Aug 2014)

Ich programmiere zwar schon ne weile, aber die Zeit spricht gegen mich. Ich brauch immer recht viel Debugphase weil ich beim Planen aufgrund meiner doch niedrigen Erfahrungswerte immer wieder iwo anecke.


----------

