Ich bin nicht sicher, wie das Passwort-Hashing funktioniert (wird später implementiert), muss aber jetzt ein Datenbankschema erstellen.
Ich denke darüber nach, Passwörter auf 4 bis 20 Zeichen zu beschränken, aber wie ich nach dem Verschlüsseln verstehe, wird die Hash-Zeichenfolge unterschiedlich lang sein.
Wie werden diese Passwörter in der Datenbank gespeichert?
Antworten:
Update: Die einfache Verwendung einer Hash-Funktion ist nicht stark genug, um Passwörter zu speichern. Sie sollten die Antwort von Gilles in diesem Thread lesen, um eine detailliertere Erklärung zu erhalten.
Verwenden Sie für Kennwörter einen schlüsselverstärkenden Hash-Algorithmus wie Bcrypt oder Argon2i. Verwenden Sie in PHP beispielsweise die Funktion password_hash () , die standardmäßig Bcrypt verwendet.
Das Ergebnis ist eine 60-stellige Zeichenfolge, die der folgenden ähnelt (die Ziffern variieren jedoch, da sie ein eindeutiges Salz erzeugen).
Verwenden Sie den SQL-Datentyp
CHAR(60)
, um diese Codierung eines Bcrypt-Hash zu speichern. Beachten Sie, dass diese Funktion nicht als hexadezimale Zeichenfolge codiert, sodass wir die Speicherung in Binärdateien nicht so einfach aufheben können.Andere Hash-Funktionen werden noch verwendet, jedoch nicht zum Speichern von Passwörtern. Daher behalte ich die ursprüngliche Antwort aus dem Jahr 2008 bei.
Dies hängt vom verwendeten Hashing-Algorithmus ab. Das Hashing erzeugt unabhängig von der Eingabe immer ein Ergebnis gleicher Länge. Es ist typisch, das binäre Hash-Ergebnis im Text als eine Reihe von hexadezimalen Ziffern darzustellen. Oder Sie können die
UNHEX()
Funktion verwenden, um eine Folge von Hex-Ziffern um die Hälfte zu reduzieren.Ab 2015 empfiehlt NIST die Verwendung von SHA-256 oder höher für alle Anwendungen von Hash-Funktionen, die Interoperabilität erfordern. NIST empfiehlt jedoch nicht, diese einfachen Hash-Funktionen zum sicheren Speichern von Kennwörtern zu verwenden.
Geringere Hashing-Algorithmen haben ihre Verwendung (wie anwendungsintern, nicht zum Austausch), aber sie sind bekanntermaßen knackbar .
quelle
Sie können tatsächlich
CHAR
(Länge des Hash) verwenden , um Ihren Datentyp für MySQL zu definieren, da jeder Hashing-Algorithmus immer die gleiche Anzahl von Zeichen ergibt. Gibt beispielsweiseSHA1
immer eine 40-stellige Hexadezimalzahl zurück.quelle
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:
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
wobei
algorithm
eine Zahl oder eine kurze alphanumerische Zeichenfolge codiert , die Wahl des Algorithmusparameters
ist eine druckbare Zeichenfolge undsalt
undoutput
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.
quelle
Vielleicht lohnt sich dieser Wikipedia-Artikel zum Thema Salzen . Die Idee ist, ein festgelegtes Datenbit hinzuzufügen, um Ihren Hash-Wert zufällig zu bestimmen. Dies schützt Ihre Passwörter vor Wörterbuchangriffen, wenn jemand unbefugten Zugriff auf die Passwort-Hashes erhält.
quelle
Als Zeichenfolge fester Länge (VARCHAR (n) oder wie auch immer MySQL es nennt). Ein Hash hat immer eine feste Länge von beispielsweise 12 Zeichen (abhängig vom verwendeten Hash-Algorithmus). Ein 20-Zeichen-Passwort würde also auf einen 12-Zeichen-Hash reduziert, und ein 4-Zeichen-Passwort würde auch einen 12-Zeichen-Hash ergeben.
quelle
Aus
TEXT
Gründen der Vorwärtskompatibilität sollten Sie (unbegrenzte Anzahl von Zeichen speichern) verwenden. Hashing-Algorithmen müssen (müssen) mit der Zeit stärker werden, und daher muss dieses Datenbankfeld mit der Zeit mehr Zeichen unterstützen. Abhängig von Ihrer Migrationsstrategie müssen Sie möglicherweise neue und alte Hashes im selben Feld speichern. Daher wird nicht empfohlen, die Länge auf einen Hash-Typ festzulegen.quelle
Es hängt wirklich vom verwendeten Hashing-Algorithmus ab. Die Länge des Passworts hat wenig mit der Länge des Hash zu tun, wenn ich mich richtig erinnere. Suchen Sie nach den Spezifikationen des von Ihnen verwendeten Hashing-Algorithmus, führen Sie einige Tests durch und kürzen Sie direkt darüber.
quelle
Hashes sind eine Folge von Bits (128 Bit, 160 Bit, 256 Bit usw., abhängig vom Algorithmus). Ihre Spalte sollte binär und nicht text- / zeichenartig sein, wenn MySQL dies zulässt (SQL Server-Datentyp ist
binary(n)
odervarbinary(n)
). Sie sollten auch die Hashes salzen. Salze können Text oder Binär sein, und Sie benötigen eine entsprechende Spalte.quelle
Ich habe immer getestet, um die maximale Zeichenfolgenlänge einer verschlüsselten Zeichenfolge zu ermitteln und diese als Zeichenlänge eines VARCHAR-Typs festzulegen. Abhängig davon, wie viele Datensätze Sie haben werden, kann dies die Datenbankgröße erheblich verbessern.
quelle
für md5 ist vARCHAR (32) geeignet. Für diejenigen, die AES verwenden, ist es besser, Varbinary zu verwenden.
quelle