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 correct horse in
„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
Vier Operationen
| Operation | Braucht einen Schlüssel? | Lässt sie sich rückgängig machen? | Wofür sie da ist |
|---|---|---|---|
| Kodieren (Base64) | nein | ja, von jedem | Bytes dorthin tragen, wo nur Text passt. Es schützt nichts |
| Hashen (SHA-256) | nein | nein, und dieselbe Eingabe ergibt immer denselben Digest | zeigen, dass zwei Dinge gleich sind, wie es das ETag getan hat |
| Signieren mit einem Tag mit Schlüssel | ein geheimer Schlüssel, den Ersteller und Prüfer teilen | nicht rückgängig gemacht: neu berechnet und verglichen | zeigen, dass eine Nachricht von jemandem mit dem Schlüssel stammt und seitdem nicht geändert wurde |
| Verschlüsseln | ja | nur mit dem Schlüssel | den 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:
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
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
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.