Verwenden Sie immer einen Passwort-Hashing-Algorithmus: Argon2 , scrypt , bcrypt oder PBKDF2 .
Argon2 hat den Passwort-Hashing-Wettbewerb 2015 gewonnen. Scrypt , bcrypt und PBKDF2 sind ältere Algorithmen, die derzeit als weniger bevorzugt gelten, aber dennoch grundsätzlich solide sind. Wenn Ihre Plattform Argon2 noch nicht unterstützt, ist es in Ordnung, vorerst einen anderen Algorithmus zu verwenden.
Speichern Sie niemals ein Passwort direkt in einer Datenbank. Verschlüsseln Sie es auch nicht: Andernfalls erhält der Angreifer bei einem Verstoß gegen Ihre Website den Entschlüsselungsschlüssel und kann so alle Kennwörter abrufen. Passwörter MÜSSEN gehasht werden .
Ein Kennwort-Hash hat andere Eigenschaften als ein Hash-Tabellen-Hash oder ein kryptografischer Hash. Verwenden Sie niemals einen normalen kryptografischen Hash wie MD5, SHA-256 oder SHA-512 für ein Passwort. Ein Passwort-Hashing-Algorithmus verwendet ein Salt , das eindeutig ist (nicht für andere Benutzer oder in der Datenbank anderer verwendet). Das Salt ist notwendig, damit Angreifer die Hashes gängiger Passwörter nicht einfach vorberechnen können: Mit einem Salt müssen sie die Berechnung für jedes Konto neu starten. Ein Passwort-Hashing-Algorithmus ist an sich langsam - so langsam, wie Sie es sich leisten können. Langsamkeit schmerzt den Angreifer viel mehr als Sie, weil der Angreifer viele verschiedene Passwörter ausprobieren muss. Weitere Informationen finden Sie unter So sichern Sie Kennwörter sicher .
Ein Passwort-Hash codiert vier Informationen:
- Ein Indikator dafür, welcher Algorithmus verwendet wird. Dies ist für die Agilität erforderlich : Kryptografische Empfehlungen ändern sich im Laufe der Zeit. Sie müssen in der Lage sein, auf einen neuen Algorithmus umzusteigen.
- Ein Schwierigkeits- oder Härteindikator. Je höher dieser Wert ist, desto mehr Berechnungen sind erforderlich, um den Hash zu berechnen. Dies sollte eine Konstante oder ein globaler Konfigurationswert in der Kennwortänderungsfunktion sein, sollte jedoch mit der Zeit zunehmen, wenn Computer schneller werden. Daher müssen Sie sich den Wert für jedes Konto merken. Einige Algorithmen haben einen einzigen numerischen Wert, andere haben dort mehr Parameter (zum Beispiel, um die CPU-Auslastung und die RAM-Auslastung getrennt abzustimmen).
- Das Salz. Da das Salz global eindeutig sein muss, muss es für jedes Konto gespeichert werden. Das Salz sollte bei jeder Passwortänderung zufällig generiert werden.
- Der eigentliche Hash, dh die Ausgabe der mathematischen Berechnung im Hashing-Algorithmus.
Viele Bibliotheken enthalten Paarfunktionen, die diese Informationen bequem als einzelne Zeichenfolge verpacken: eine, die den Algorithmusindikator, den Härteindikator und das Kennwort verwendet, ein zufälliges Salt generiert und die vollständige Hashzeichenfolge zurückgibt; und eine, die ein Passwort und die vollständige Hash-Zeichenfolge als Eingabe verwendet und einen Booleschen Wert zurückgibt, der angibt, ob das Passwort korrekt war. Es gibt keinen universellen Standard, aber eine übliche Kodierung
$ algorithm $ parameters $ salt $ output
wobei algorithm
eine Zahl oder eine kurze alphanumerische Zeichenfolge codiert , die Wahl des Algorithmus parameters
ist eine druckbare Zeichenfolge und salt
und output
ist in Base64 codiert ohne zu Beenden =
.
16 Bytes reichen für das Salt und die Ausgabe. (Siehe z. B. Empfehlungen für Argon2 .) In Base64 codiert, sind das jeweils 21 Zeichen. Die anderen beiden Teile hängen vom Algorithmus und den Parametern ab, aber 20 bis 40 Zeichen sind typisch. Das sind insgesamt ungefähr 82 ASCII-Zeichen ( CHAR(82)
und kein Unicode erforderlich), zu denen Sie einen Sicherheitsspielraum hinzufügen sollten, wenn Sie der Meinung sind, dass es später schwierig sein wird, das Feld zu vergrößern.
Wenn Sie den Hash in einem Binärformat codieren, können Sie ihn für den Algorithmus auf 1 Byte, für die Härte auf 1 bis 4 Byte (wenn Sie einige der Parameter hart codieren) und für das Salt und die Ausgabe jeweils auf 16 Byte reduzieren für insgesamt 37 Bytes. Sagen Sie 40 Bytes ( BINARY(40)
), um mindestens ein paar freie Bytes zu haben. Beachten Sie, dass dies 8-Bit-Bytes sind, keine druckbaren Zeichen. Insbesondere kann das Feld Null-Bytes enthalten.
Beachten Sie, dass die Länge des Hashs völlig unabhängig von der Länge des Passworts ist.