Hashing vs. Verschlüsselung vs. Kodierung: Was oft verwechselt wird
Drei Umformungen, die alle Kauderwelsch erzeugen und verschiedene Probleme lösen, samt gemessener Kosten der falschen Wahl bei Passwörtern.
Kodierung, Verschlüsselung und Hashing machen aus lesbaren Daten Kauderwelsch, weshalb sie als austauschbar behandelt werden. Sie lösen drei zusammenhanglose Probleme, und die falsche Wahl erzeugt Code, der sicher aussieht und es nicht ist.
Eine Frage trennt sie: Brauchen Sie das Original je zurück, und wenn ja, wer darf es bekommen?
Die drei nebeneinander
- Kodierung ändert das Format, damit ein anderes System die Daten tragen kann. Kein Schlüssel, für jeden umkehrbar, kein Sicherheitswert.
- Verschlüsselung verbirgt Daten vor jedem ohne Schlüssel. Mit ihm umkehrbar, und das ist der Sinn.
- Hashing erzeugt einen Fingerabdruck fester Grösse. Einweg, weil die ursprüngliche Information weg ist.
Kodierung ist ein Transportformat, keine Massnahme
Daten müssen Systeme durchqueren, die nur bestimmte Bytebereiche akzeptieren, also drückt man Bytes in einem freundlicheren Alphabet aus. Base64 bildet auf 64 druckbare Zeichen ab, Hex auf zwei Zeichen pro Byte, URL-Kodierung macht aus einem Leerzeichen %20.
Es gibt keinen Schlüssel und nichts zu knacken:
echo "aGVsbG8=" | base64 -d
hello
Das ist der gesamte Angriff. Prüfen Sie es mit dem Base64-Encoder/Decoder an einer beliebigen Zeichenkette nach.
Kodierung ist wirklich nützlich und wirklich nicht schützend. HTTP Basic Auth ist der klarste Fall: Authorization: Basic <base64> wird in mehr Konzeptpapieren als "verschlüsselte Zugangsdaten" beschrieben, als gut ist, und es ist eine umkehrbare Umformung von Benutzername und Passwort. Genau deshalb darf es nie ausserhalb von TLS reisen.
Gehört zu Ihrem Bedrohungsmodell jemand, der die Daten nicht lesen soll, leistet Kodierung überhaupt nichts.
Verschlüsselung, wenn Sie es zurückbrauchen
Klartext plus Schlüssel ergibt ein Chiffrat, das ohne diesen Schlüssel nutzlos ist. Sie greifen dazu, wann immer die Originaldaten später gebraucht werden: ein OAuth-Refresh-Token in einer Datenbank, eine Datei in einem nicht vollständig kontrollierten Speicher, ein Sitzungs-Payload in einem Cookie.
Nehmen Sie einen authentifizierten Modus. AES-256-GCM liefert Chiffrat und ein Authentifizierungs-Tag, Manipulation scheitert also laut, statt zu plausiblem Müll zu entschlüsseln. Reines CBC ohne separaten MAC gibt Ihnen dieses Signal nicht, und diese Lücke hat echte Schwachstellen erzeugt. Unser AES verschlüsseln/entschlüsseln beherrscht GCM, CBC und CTR auf Text in der Seite, Sie können also zusehen, wie eine falsche Passphrase gar nichts liefert.
Symmetrisch heisst ein Schlüssel in beide Richtungen. AES wohnt hier, es ist schnell, und schwierig ist, den Schlüssel zur Gegenseite zu bekommen.
Asymmetrisch heisst ein Paar aus öffentlichem und privatem Schlüssel, wobei der öffentliche verschlüsselt und nur der private entschlüsselt. RSA und die Kurvenverfahren wohnen hier, sie sind deutlich langsamer, und sie lösen die Verteilung. TLS nutzt asymmetrische Kryptografie nur, um sich auf einen symmetrischen Schlüssel zu einigen, und wechselt dann für den Verkehr zu AES, womit beide Eigenschaften da sind.
Der Test: Wenn jemand verschlüsseln können soll, ohne entschlüsseln zu können, brauchen Sie asymmetrisch.
Hashing erzeugt einen Fingerabdruck, keinen Tresor
Ein kryptografischer Hash bildet jede Eingabe deterministisch und einwegig auf eine Ausgabe fester Grösse ab. SHA-256 liefert 256 Bit, ob Sie einen Buchstaben oder eine Vier-Gigabyte-Datei hineingeben.
"hello" -> 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
"Hello" -> 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
Ein Grossbuchstabe, eine völlig unverwandte Ausgabe. Dieser Lawineneffekt macht Hashing für Integrität nützlich: Download hashen, mit dem veröffentlichten Wert vergleichen, und ein einziges verändertes Byte fällt auf. Unser Hash-Generator erzeugt SHA-256 und Verwandte lokal.
Zur Algorithmuswahl: MD5 und SHA-1 sind für Sicherheitszwecke erledigt. SHA-1-Kollisionen sind nicht theoretisch, sie wurden konstruiert: zwei verschiedene PDFs mit demselben Wert3. Nehmen Sie SHA-256 oder SHA-3. MD5 bleibt nur dort vertretbar, wo niemand Sie täuschen will, etwa beim Erkennen zufälliger Dateibeschädigung.
Ein Hash ist keine Verschlüsselung, und man kann ihn nicht entschlüsseln. Die Ausgabe ist kleiner als die Eingabe, und es gibt keinen Schlüssel. Was ein Angreifer tun kann, ist raten, den Rateversuch hashen und vergleichen, und genau dort geht Passwort-Code schief.
Der teure Fehler
Die Überlegung ist verführerisch: Hashing ist einwegig, also ist ein gehashtes Passwort sicher, also tut es SHA-256. Es ist eine Schwachstelle, und ihre Grösse ist messbar.
Auf einer einzelnen RTX 5090 misst hashcat 28.353,3 MH/s gegen SHA-256 und 304,8 kH/s gegen bcrypt bei Kosten 52. Der bcrypt-Kostenfaktor ist eine Zweierpotenz, Kosten 10 sind also das 32-Fache: rund 9.525 Versuche pro Sekunde.
Das ist ein Verhältnis von etwa drei Millionen zu eins. Ein Passwort, das gegen bcrypt vier Stunden Angriff übersteht, fällt gegen SHA-256 in etwa fünf Millisekunden, auf derselben Karte, in derselben Datenpanne. Keine der Funktionen ist kaputt. Eine ist absichtlich schnell, und dieser Zweck ist nicht Passwortspeicherung.
Einfaches Hashing hat ein zweites Problem: Gleiche Passwörter ergeben gleiche Hashes, ein Angreifer hasht also ein Wörterbuch einmal und gleicht es gleichzeitig gegen jede erbeutete Zeile ab.
Salt
Ein Zufallswert, je Nutzerin einmalig, vor dem Hashen beigemischt. Zwei Personen mit demselben Passwort speichern nun verschiedene Hashes, was vorberechnete Tabellen erledigt und den Angreifer zwingt, jedes Konto einzeln anzugehen. Das Salt ist nicht geheim und wird neben dem Hash gespeichert. Seine einzige Aufgabe ist Einmaligkeit.
Eine absichtlich langsame Ableitungsfunktion
Salt verlangsamt nichts, das muss die Funktion selbst tun. OWASPs aktuelle Rangfolge1:
- Argon2id ist die erste Wahl. Über Speicher, Zeit und Parallelität einstellbar, und die Speicherkosten sind es, die GPUs und ASICs ausbremsen.
- scrypt ist die Alternative, wenn Argon2 fehlt, ebenfalls speicherhart.
- bcrypt ist ausdrücklich für Altsysteme gedacht, in denen es keines von beiden gibt. Gut zu wissen: Es ignoriert stillschweigend alles nach den ersten 72 Bytes.
- PBKDF2 ist nicht speicherhart und hält GPUs am schlechtesten stand, ist aber FIPS-zugelassen, weshalb regulierte Umgebungen es weiter nutzen. OWASP setzt den Arbeitsfaktor für HMAC-SHA256 auf 600.000 Iterationen. Unser PBKDF2-Hash-Generator zeigt, wie Iterationen und Salt in die Ausgabe eingehen.
Beachten Sie, dass bcrypt tiefer steht als in den meisten Artikeln, auch als in der früheren Fassung dieses hier, die es "älter, aber weiterhin respektabel" nannte und als aktuelle gute Wahl führte.
Das Modell, das Sie aus Schwierigkeiten heraushält: Ein schneller Hash ist für Integrität, wo Tempo das Feature ist. Eine langsame Ableitungsfunktion ist für Passwörter, wo Langsamkeit das ganze Produkt ist.
HMAC: ein Hash mit Schlüssel
Ein einfacher Hash belegt, dass eine Nachricht nicht versehentlich verändert wurde. Über den Urheber belegt er nichts, denn jeder kann ihn nachrechnen, also kann jeder die Nachricht ändern und einen passenden Wert nachrechnen.
HMAC mischt einen geheimen Schlüssel in die Konstruktion. Ohne den Schlüssel lässt sich kein gültiges Tag erzeugen, also auch nichts unbemerkt fälschen oder ändern. Das prüft Webhook-Payloads und signierte API-Anfragen: HMAC mit dem gemeinsamen Geheimnis nachrechnen, vergleichen, annehmen. Unser HMAC-Generator macht die Abhängigkeit sichtbar, denn ein geändertes Zeichen im Schlüssel ändert das ganze Tag.
HMAC gibt Integrität und Authentizität, keine Vertraulichkeit. Die Nachricht bleibt lesbar. Soll sie auch verborgen sein, verschlüsseln Sie zusätzlich.
Die Entscheidungstabelle
| Ich möchte | Nehmen | Nicht |
|---|---|---|
| Binärdaten durch einen Textkanal schicken | Kodierung (Base64, Hex) | Irgendetwas namens Verschlüsselung |
| Daten verbergen und selbst zurücklesen | AES-256-GCM | Hashing, Kodierung |
| Andere an mich verschlüsseln lassen ohne geteiltes Geheimnis | RSA oder ECC | Symmetrisch |
| Nutzerpasswörter speichern | Argon2id oder scrypt | SHA-256, MD5, Kodierung, Verschlüsselung |
| Prüfen, dass ein Download unverändert ist | SHA-256 | Eine langsame KDF |
| Belegen, dass eine Nachricht von einem vertrauten Absender kommt | HMAC-SHA-256 | Ein einfacher Hash |
| Zufällige Dateibeschädigung erkennen | CRC32, auch MD5 | Eine langsame KDF |
Fünf Arten, wie das schiefgeht
Jede davon ist ein Fehlerbild mit Namen, und jede folgt daraus, ein Werkzeug nach dem Aussehen seiner Ausgabe zu wählen statt nach seiner Funktion.
-
Base64 in einer Spalte namens
encrypted_password. Ein Datenbankexport, und jedes Passwort liegt im Klartext, weil nie etwas verschlüsselt wurde. -
Ungesalzenes MD5 für Passwörter. Schnell und kollisionsanfällig, und beides verstärkt sich. Erbeutete Hashes treffen fast sofort auf vorberechnete Tabellen.
-
Passwörter verschlüsseln statt hashen. Gemacht, damit Logins durch Entschlüsseln und Vergleichen "geprüft" werden können. Das System kann nun jedes Klartextpasswort zurückholen, also genau das Ergebnis, das verhindert werden sollte. Sie brauchen ein Passwort nie zurück, nur ein Ja oder Nein zu einem Login-Versuch, und schon die Existenz eines Entschlüsselungspfads ist der Fehler.
-
Daten hashen, die man später braucht. Das Spiegelbild. Kontonummern werden SHA-256 gehasht, dann soll sie jemand anzeigen, und die Daten sind weg. Das war von Anfang an eine Verschlüsselungsaufgabe.
-
Ein einfacher Hash, wo HMAC hingehört. Ein Webhook-Endpunkt hasht den Body und vergleicht ihn mit einem Header, ganz ohne Geheimnis. Jeder kann diesen Hash rechnen, also kann jeder die Anfrage fälschen. Der Schlüssel ist der ganze Punkt.
Zusammenfassung
Kodierung formatiert um und schützt nichts. Verschlüsselung verbirgt Daten vor jedem ohne Schlüssel und ist das, was Sie wollen, wann immer das Original später gebraucht wird. Hashing liefert einen Einweg-Fingerabdruck für Integrität und Prüfung.
Passwörter sind der Fall, in dem die falsche Wahl am teuersten und am besten messbar ist: salzen, durch Argon2id schicken, und verstehen, dass stattdessen zu SHA-256 zu greifen den Durchsatz Ihres Angreifers etwa verdreimillionenfacht.
Wählen Sie nach dem Problem, nicht danach, wie das Kauderwelsch aussieht.
Quellen
Jede Zahl in diesem Artikel lässt sich auf eine Quelle unten zurückführen. Behauptungen ohne Beleg wurden gestrichen, nicht abgeschwächt.
- PrimärquelleOWASP
Dass Argon2id die empfohlene erste Wahl für Passwort-Hashing ist, dass bcrypt nur in Altsystemen verwendet werden sollte, in denen Argon2 und scrypt fehlen, und der empfohlene Arbeitsfaktor von 600.000 Iterationen für PBKDF2-HMAC-SHA256.
- PrimärquelleChick3nman
Die gemessenen Werte einer einzelnen Karte von 28.353,3 MH/s gegen SHA2-256 und 304,8 kH/s gegen bcrypt bei Kosten 5, aus denen der Wert für Kosten 10 abgeleitet ist.
- PrimärquelleCWI Amsterdam und Google Research
Dass eine praktische Kollision für volles SHA-1 vorgeführt wurde, mit zwei verschiedenen PDF-Dateien gleichen SHA-1-Werts.
Themen
- Hashing
- Encryption
- Encoding
- Cryptography
- Passwords
In diesem Artikel erwähnte Tools
- Hash Generator - Generate SHA-1, SHA-256, SHA-384 and SHA-512 hashes from text.
- HMAC Generator - Generate HMAC signatures with SHA-1, SHA-256, SHA-384 and SHA-512.
- AES-256 Encrypt / Decrypt Online - Free, In-Browser - Encrypt and decrypt text with AES-128, AES-192, or AES-256 in GCM, CBC, or CTR mode. PBKDF2 key derivation, entirely in your browser.
- Base64 Encoder & Decoder - Encode UTF-8 text to Base64 online or decode Base64 back to UTF-8 and plain text. Runs in your browser with no upload.
- PBKDF2 Hash Generator - Derive cryptographic keys from passwords using PBKDF2 with configurable iterations, salt and hash function.
Neue Tools per E-Mail
Neue Tools und gelegentlich ein ausführlicher Artikel, etwa einmal im Monat. Kein Spam, deine Adresse bekommt niemand, Abmeldung mit einem Klick.