~~NOTOC~~ ====== VI. Konkrete Verschlüsselung im Internet (SSL/TLS) ====== Was passiert nun zusammenfassend also konkret, wenn man sich im Internet bewegt und sensible Daten ausgetauscht werden sollen? Egal ob es sich um Kreditkartennummer, Passwörter, persönliche Daten in einem Onlineshop, E-Banking etc. handelt, sollten die Daten unbedingt verschlüsselt werden, da sie durchaus von Dritten „angezapft“ und gelesen werden können. An der Internetadresse ist leicht zu erkennen, ob der Datenaustausch verschlüsselt oder unverschlüsselt passiert, denn die Internetadresse wechselt von http (Hypertext Transfer Protocol) auf https (Hypertext Transfer Protocol Secure). Zudem ist links neben der Internetadresse ein Symbol mit einem geschlossenen Schloss zu sehen. Betrachten wir z.B. den Aufruf der Seite Instagram: {{:planung:kryptologie:instagram.png?400|}} Der Client (mein Browser z.B. Google Chrome/Safari/Firefox) verbindet sich mit dem Server von Instagram und sendet ein sogenanntes „Client Hello“. Dies ist eine Startmeldung, die dem Server zu verstehen gibt, dass sich jemand mit ihm verschlüsselt „unterhalten will“. Nun müssen sich Chrome und der Instagram-Server darauf verständigen, welche Verschlüsselungsmethode und welcher Schlüssel verwendet werden. Theoretisch könnte der Server einfach seinen öffentlichen Schlüssel senden und der Client verschlüsselt die gesamten Daten mit diesem öffentlichen Schlüssel und schickt sie dem Server, doch bei grösseren Datenmengen ist dies ineffizient, da es aufwändig ist, viele Daten mit dem RSA-Verfahren auszutauschen. Es wird daher von beiden Seiten ein symmetrisches Verfahren verwendet, welches zunächst abgemacht wird (früher DES oder 3DES, heute AES oder ChaCha9). Welches Verfahren verwendet wird, hängt davon ab, welche Verschlüsselung der Client und der Server beherrschen. Bevor aber symmetrisch verschlüsselt werden kann, muss zunächst ein Schlüssel (Session-Key) ausgetauscht werden. Dieser Schlüsseltausch geschieht mit dem RSA- oder mit dem Diffie-Hellman Verfahren. Sobald beiden Parteien den Schlüssel haben, wird der gesamte Nachrichtenverkehr mit diesem Schlüssel verschlüsselt und bei jeder Neuverbindung wird ein neuer Schlüssel gewählt. Konkret geschieht das Folgende: * Im Handshake machen Client und Server die Protokolle aus, welche verwendet werden sollen. * Der Client sendet eine ClientHello-Meldung, in der er angibt, welche Verschlüsselungs-Algorithmen er beherrscht und er sendet Zufallszahlen und den öffentlichen Teil für den Diffie-Hellman Schlüsseltausch. * Der Server antwortet mit der ServerHello-Nachricht. Er entscheidet, welche Verschlüsselungs-Algorithmen verwendet werden und seinen öffentlichen Teil für Diffie-Hellman. Damit können beide einen geheimen Schlüssel generieren (Diffie-Hellman mit elliptischen Kurven ECDH) * Der Server schickt sein Zertifikat, welches über eine Trusted-Chain von einer Root-Zertifizierungsstelle signiert wurde. Der Client prüft das Zertifikat und weiss nun, dass er tasächlich mit der gewünschten Domain kommuniziert. * Der Handshake wird mitprotokolliert und gehashed und in einer Finished-Nachricht mit einem MAC übertragen. Dadurch können der Server und der Client sicher sein, dass sie denselben Handshake abgemacht haben (Schutz vor Man-in-the-middle-Attacke). * Aus dem gemeinsam erstellten Schlüssel generieren Server und Client die verschiedenen Schlüssel (für MAC des Handshakes und die konkreten Schlüssel für die Blockchiffre) * Nun werden alle Daten mit dem abgemachten AEAD-Algorithmus verschlüsselt übertragen (AES-GCD oder ChaCha20-Poly1305). Dieser AEAD-Algorithmus sorgt für die Verschlüsselung und die Integrität und Authentizität der Daten. **Aufgabe ** - Was ist der grosse Unterschied zwischen einem symmetrischen und einem asymmetrischen Verschlüsselungssystem? - Was versteht man unter Integrität und Authentizität? - Wie kann man mit der Public-Key Kryptographie (z.B. RSA) eine digitale Unterschrift realisieren? - Warum benötigt man eine unabhängige Zertifizierungsstelle? - Klicke in Google Chrome bei einer gesicherten Verbindung rechts oben auf die drei Punkte und dann auf "Weitere Tools"->"Entwicklertools". Nun kannst du unter "Security" sehen, ob und wie deine Verbindung gesichert ist. ECDHE_RSA bedeutet z.B., dass (Elliptic-Curve)Diffie Hellman für den Schlüsseltausch und RSA für die Authentifizierung verwendet wird. AES_256 ist eine Spezifikation für die verwendete symmetrische Verschlüsselung. https://www.howsmyssl.com/ Hier sieht man, welche Verschlüsselungsverfahren der Browser beherrscht. Die Abkürzungen enthalten sowohl die Methode, wie der Schlüssel ausgetauscht wird, als auch welche Symmetrische Verschlüsselung danach verwendet wird. Z.B. ECDHE = Elliptic Curve Diffie-Hellman (Schlüsseltausch) Komplette Informationen z.B hier: https://ciphersuite.info/cs/TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256/ **Beispiel: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ** * Für den Schlüsseltausch wird ECDHE verwendet, also Diffie-Hellman mit Elliptischen Kurven * Für das Zertifikat wird das asymmetrische RSA-Verfahren verwendet. * Es wird der AEAD-Algorithmus AES256_GCM vewendet (AES Blockchiffre mit GCM-MAC zur Authentifizierung und Integrität) * Die Hashes (z.B. Hash der Finished-Nachricht beim Handshake) wird SHA384 verwendet. [[ef:start|Zurück zur Übersicht]]