372 Stimmen

Welchen Spaltentyp/welche Spaltenlänge sollte ich für die Speicherung eines Bcrypt Hash-Passworts in einer Datenbank verwenden?

Ich möchte ein gehashtes Passwort (mit BCrypt) in einer Datenbank speichern. Welcher Typ wäre dafür geeignet, und welche Länge wäre die richtige? Sind mit BCrypt gehashte Passwörter immer gleich lang?

EDITAR

Beispiel Hash:

$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu

Nach dem Hashing einiger Passwörter scheint es, dass BCrypt immer 60-Zeichen-Hashes erzeugt.

EDIT 2

Entschuldigung, dass ich die Umsetzung nicht erwähnt habe. Ich bin mit jBCrypt .

418voto

Gumbo Punkte 617646

Das modulare Kryptoformat für bcrypt besteht aus

  • $2$ , $2a$ o $2y$ Identifizierung der Hashing-Algorithmus und Format
  • ein zweistelliger Wert, der den Kostenparameter angibt, gefolgt von $
  • einen 53 Zeichen langen, Base-64-kodierten Wert (sie verwenden das Alphabet . , / , 0 - 9 , A - Z , a - z die sich von der Standard Base 64 Kodierung Alphabet) bestehend aus:
    • 22 Zeichen Salz (effektiv nur 128 Bits der 132 dekodierten Bits)
    • 31 Zeichen der verschlüsselten Ausgabe (effektiv nur 184 Bits der 186 dekodierten Bits)

Die Gesamtlänge beträgt also 59 bzw. 60 Bytes.

Da Sie das 2a-Format verwenden, benötigen Sie 60 Bytes. Daher empfehle ich für MySQL die Verwendung des CHAR(60) BINARY o BINARY(60) (siehe En _bin y binär Zusammenstellungen für Informationen über den Unterschied).

CHAR ist nicht binärsicher und die Gleichheit hängt nicht nur vom Byte-Wert, sondern von der tatsächlichen Sortierung ab; im schlimmsten Fall A wird gleichgesetzt mit a . Siehe En _bin y binary Zusammenstellungen für weitere Informationen.

61voto

Andre D Punkte 4455

Ein Bcrypt-Hash kann in einem BINARY(40) Spalte.

BINARY(60) ist, wie die anderen Antworten nahelegen, die einfachste und natürlichste Wahl, aber wenn Sie die Speichereffizienz maximieren wollen, können Sie 20 Bytes sparen, indem Sie den Hash verlustfrei dekonstruieren. Ich habe dies auf GitHub ausführlicher dokumentiert: https://github.com/ademarre/binary-mcf

Bcrypt-Hashes folgen einer Struktur, die als modulares Kryptoformat (MCF) bezeichnet wird. Binär MCF (BMCF) dekodiert diese textuellen Hash-Darstellungen in eine kompaktere Binärstruktur. Im Fall von Bcrypt beträgt der resultierende binäre Hash 40 Byte.

Gumbo hat die vier Komponenten eines Bcrypt MCF-Hashes gut erklärt:

$<id>$<cost>$<salt><digest>

Die Dekodierung nach BMCF geht folgendermaßen:

  1. $<id>$ kann in 3 Bits dargestellt werden.
  2. <cost>$ , 04-31, kann in 5 Bits dargestellt werden. Zusammengenommen ergibt dies 1 Byte.
  3. Das 22-Zeichen-Salz ist eine (nicht standardisierte) Base-64-Darstellung von 128 Bit. Die Base-64-Dekodierung ergibt 16 Bytes.
  4. Der 31-Zeichen-Hash-Digest kann mit Base-64 in 23 Bytes decodiert werden.
  5. Das alles zusammen ergibt 40 Bytes: 1 + 16 + 23

Weitere Informationen finden Sie unter dem obigen Link oder unter meine PHP-Implementierung , auch auf GitHub.

29voto

Mike Punkte 21888

Wenn Sie die PHP-Funktion password_hash() mit dem PASSWORD_DEFAULT Algorithmus zur Generierung des bcrypt-Hashes verwenden (und ich nehme an, dass dies ein großer Teil der Leser dieser Frage ist), sollten Sie daran denken, dass in Zukunft password_hash() einen anderen Algorithmus als den Standardalgorithmus verwenden, was sich auf die Länge des Hashes auswirken kann (aber nicht unbedingt länger sein muss).

Von der Handbuchseite:

Beachten Sie, dass diese Konstante so konzipiert ist stärkere Algorithmen zu PHP hinzugefügt werden. Aus diesem Grund wird die Länge des des Ergebnisses bei Verwendung dieses Bezeichners mit der Zeit ändern. [ ] wird empfohlen, das Ergebnis in einer Datenbankspalte zu speichern, die über 60 Zeichen hinaus erweitert werden kann (255 Zeichen wären eine gute Wahl).

Mit bcrypt würde die Speicherung von 255-Byte-Passwort-Hashes selbst bei 1 Milliarde Nutzern (d. h. Sie konkurrieren derzeit mit Facebook) nur ~255 GB an Daten umfassen - etwa so groß wie eine kleine SSD-Festplatte. Es ist äußerst unwahrscheinlich, dass die Speicherung des Passwort-Hashes der Engpass in Ihrer Anwendung sein wird. Für den Fall, dass der Speicherplatz jedoch wirklich es aus irgendeinem Grund ein Problem, können Sie mit PASSWORD_BCRYPT zu erzwingen password_hash() bcrypt zu verwenden, auch wenn dies nicht der Standard ist. Achten Sie nur darauf, dass Sie über alle in bcrypt gefundenen Schwachstellen informiert sind und lesen Sie jedes Mal die Versionshinweise, wenn eine neue PHP-Version veröffentlicht wird. Sollte der Standardalgorithmus jemals geändert werden, wäre es gut, sich die warum und eine fundierte Entscheidung zu treffen, ob der neue Algorithmus verwendet werden soll oder nicht.

25voto

James C Punkte 13821

Ich glaube nicht, dass es irgendwelche raffinierten Tricks gibt, um dies zu speichern, wie man es zum Beispiel mit einem MD5-Hash tun kann.

Ich denke, das Beste ist, sie als CHAR(60) da sie immer 60 Zeichen lang ist

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X