0%

Kapitel 2

Hashes, MACs und Zufallswerte

Kodieren, hashen, signieren oder verschlüsseln

Dein Angriffstest aus Kapitel 1 durchsucht eine Kopie des Zustands nach dem Text correct horse. Angenommen, der Server hätte für ana stattdessen Y29ycmVjdCBob3JzZQ== gespeichert. Würde der Test durchlaufen? Ja: Der Text, nach dem er sucht, ist weg. Wäre das Passwort sicher? Nein. Dieser ist correct horse in , und jeder kann ihn zurückverwandeln.

„Das Passwort ist nicht lesbar“ ist also ein zu lockeres Ziel. Vier verschiedene Operationen können Daten unlesbar aussehen lassen, und sie versprechen vier verschiedene Dinge. Zwei davon hast du schon benutzt, Base64 im Basic-Header und einen -Digest als , ohne dich zwischen ihnen entscheiden zu müssen. Diese Lektion unterscheidet alle vier.

Vier Operationen

OperationBraucht einen Schlüssel?Lässt sie sich rückgängig machen?Wofür sie da ist
Kodieren (Base64)neinja, von jedemBytes dorthin tragen, wo nur Text passt. Es schützt nichts
Hashen (SHA-256)neinnein, und dieselbe Eingabe ergibt immer denselben Digestzeigen, dass zwei Dinge gleich sind, wie es das ETag getan hat
Signieren mit einem Tag mit Schlüsselein geheimer Schlüssel, den Ersteller und Prüfer teilennicht rückgängig gemacht: neu berechnet und verglichenzeigen, dass eine Nachricht von jemandem mit dem Schlüssel stammt und seitdem nicht geändert wurde
Verschlüsselnjanur mit dem Schlüsselden Inhalt verbergen

Lies die Tabelle spaltenweise. Die Spalte zum Schlüssel fragt, wer die Operation ausführen kann: beim Kodieren und Hashen jeder. Die Spalte zum Rückgängigmachen fragt, wer die Eingabe zurückbekommen kann: beim Kodieren jeder, beim Hashen niemand. Genauer gesagt kennt niemand einen Weg, die Eingabe aus einem Digest zu berechnen. Eine Eingabe kann trotzdem geraten und geprüft werden, und darum geht es in Kapitel 3.

Drei der vier sind in Pythons Standardbibliothek:

Try it

Das erste Zeilenpaar ist Kodieren: b'Y29ycmVjdCBob3JzZQ==' und dann wieder b'correct horse', ohne jeden Schlüssel. Das zweite Paar ist Hashen: zweimal dieselben 64 Zeichen, beginnend mit 4104d36f. Nichts verwandelt sie zurück in das Passwort, aber jeder, der das Passwort hat, kann sie berechnen. Die letzten zwei Zeilen sind neu. Es sind Tags mit Schlüssel für dieselben Bytes unter zwei verschiedenen Schlüsseln, auf ihre ersten 8 Zeichen gekürzt, und sie unterscheiden sich: b4520de8 und 20c498cf. Nur wer den Schlüssel hat, kann das Tag berechnen, das dazu gehört. Die nächste Lektion erklärt hmac.new.

Was gibt print(base64.b64decode("Y29ycmVjdCBob3JzZQ==")) aus?

Zwei Dinge namens Signieren

Das Wort „Signieren“ wird für zwei verschiedene Mechanismen verwendet, und es hilft, sie von Anfang an auseinanderzuhalten.

Ein , kurz MAC, ist ein Tag, das mit einem geteilten geheimen Schlüssel erzeugt wird. Wer das Tag prüfen kann, hat den Schlüssel, hätte es also auch erzeugen können. Ein MAC sagt dem Server „das kommt von jemandem mit unserem Schlüssel“, was nützlich ist, wenn der Server mit sich selbst spricht: Er gibt jetzt eine Nachricht heraus und will sie später wiedererkennen.

Eine Public-Key-Signatur wird mit einem privaten Schlüssel erzeugt und mit einem anderen, öffentlichen geprüft. Jeder kann sie prüfen, und nur eine Partei kann sie erzeugen.

Dieser Kurs erzeugt MACs und nennt das Signieren, was auch das Wort ist, das Token-Bibliotheken verwenden. Die andere Art triffst du in Kapitel 10, in einem .

Was dieser Kurs nicht baut

Du schreibst hier weder Verschlüsselung noch Public-Key-Signaturen. Pythons Standardbibliothek hat keinen allgemeinen Weg, Daten zu verschlüsseln oder eine Public-Key-Signatur zu erzeugen. Ihr ssl tut beides, aber nur innerhalb von . Und niemand sollte so etwas selbst schreiben: Das sind die Teile der Sicherheit, in denen ein kleiner Fehler unsichtbar und fatal ist. Wo dieser Kurs Geheimhaltung im Netzwerk braucht, verwendet er TLS, in Kapitel 10.

Auswählen

Vier Situationen und die Operation, die jede verlangt:

  • Ein Header darf nur einfache Zeichen enthalten, und du musst beliebige Bytes hineinbringen. Das ist Kodieren. Es war die Aufgabe von Base64 im Basic-Header.

  • Ein Client will wissen, ob sich die Bücherliste seit seiner letzten Frage geändert hat. Das ist Hashen: Gleiche Digests bedeuten gleiche Bodys.

  • Der Server gibt einem Client eine kleine Nachricht und muss später wissen, dass das, was zurückkommt, das ist, was er erzeugt hat. Das ist ein Tag mit Schlüssel.

  • Niemand auf dem Netzwerkweg darf ein Passwort lesen, während es unterwegs ist. Das ist Verschlüsselung, und hier bedeutet das TLS.

Eine Website bietet eine Datei zum Download an und zeigt daneben einen Wert, damit jeder prüfen kann, dass seine heruntergeladene Kopie dieselbe ist wie die Datei auf der Website. Niemand der Beteiligten hat ein Geheimnis. Welche Operation?

Eine Datenbank speichert jedes Passwort in Base64 kodiert. Was hat ein Dieb mit einer Kopie?

Von den vier Operationen hat eine noch keinen Code in deinem Projekt: das Tag mit Schlüssel. In der nächsten Lektion schreibst du es.