Wenn wir über Verschlüsselung lernen und sie zusammen mit starken Passwörtern nutzen, ist es wichtig, auch einen Blick darauf zu werfen, wie diese Passwörter auf dem Server der Website gespeichert werden. Das Problem ist, dass etwas, sobald du es an einen Server sendest, aus deinen Händen ist, sofern du den Server nicht selbst betreibst. Daher ist es für Serverbetreiber wichtig, so wenig Informationen wie möglich auf dem Server zu speichern, es sei denn, sie liegen in einem unlesbaren, verschlüsselten Format vor.
SQL-Injektionen und Datenbank-Kompromittierungen können alles im Klartext offenlegen, und sie sind überraschend häufige Vorkommnisse. Hashing ist der Verschlüsselung ähnlich, kommt aber beim sicheren Speichern von Passwörtern ins Spiel. Wenn du dich bei vielen Websites registrierst, nehmen sie dein Passwort und speichern es auf dem Server, sodass es bei jedem Login einfach die beiden Passwörter vergleicht, und wenn sie gleich sind, meldet es dich an. Das ist jedoch unglaublich unsicher, selbst wenn SSL implementiert ist.
Die guten Websites/Server (was inzwischen die Mehrheit von ihnen sein sollte) hashen deine Passwörter, bevor sie an den Server gesendet werden, was im Grunde bedeutet, sie in einer durcheinandergewürfelten Form zu speichern. Das geschieht üblicherweise über das, was wir “Hashing-Algorithmen” nennen, etwa SHA256 oder SHA512. Nebenbei bemerkt sind das zwei gängige Hashing-Algorithmen, die oft von PBKDF2 begleitet werden (das für Key Stretching https://www.schneier.com/cryptography/paperfiles/paper-low-entropy.pdf verwendet wird, um Brute-Force-Versuche zu vereiteln). Wenn du dich dann das nächste Mal bei der Seite anmeldest, wandelt dein Browser das Passwort in dieselbe Zeichenfolge aus zufälligen Zeichen um und gleicht sie mit der Zeichenfolge aus zufälligen Zeichen ab, die er auf dem Server gespeichert hat. Wenn die beiden übereinstimmen, bist du authentifiziert und erhältst Zugang zu deinem Konto.
Um etwas detaillierter auf Key Stretching und PBKDF2 einzugehen: Es gibt einen verwandten Begriff, bekannt als Password Iterations oder Iteration Count, der die Rechenleistung definiert, die zwischen Passwortversuchen aufgewendet werden muss. Je höher die Anzahl der verwendeten Runden, desto sicherer wird dein Konto/deine Verschlüsselung/dein Passwort sein. Unternehmen können dem Hash auch ein Salt hinzufügen, das eine zufällige Zeichenfolge am Ende anhängt und Wörterbuchangriffe aktiv vereitelt (https://en.wikipedia.org/wiki/Salt_%28cryptography%29). Zur Orientierung sind hier die Standard-Iterationszahlen für 4 gängige Dienste/Anwendungen aufgeführt:
- LastPass: 5.000 (clientseitig) + 100.000 weitere (serverseitig)
- TrueCrypt: 1000
- VeraCrypt: 500.000
- FileVault2: 41.000