Ich möchte ein Hash-Passwort (mit BCrypt) in einer Datenbank speichern. Was wäre ein guter Typ dafür und welche wäre die richtige Länge? Sind mit BCrypt gehashte Passwörter immer gleich lang?
BEARBEITEN
Beispiel-Hash:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
Nach dem Hashing einiger Passwörter scheint BCrypt immer Hashes mit 60 Zeichen zu generieren.
BEARBEITEN 2
Entschuldigung, dass Sie die Implementierung nicht erwähnt haben. Ich benutze jBCrypt .
Antworten:
Das modulare Krypta-Format für bcrypt besteht aus
$2$
,$2a$
Oder$2y$
Identifizieren des Hashing - Algorithmus und Format$
.
,/
,0
-9
,A
-Z
,a
-z
, die die verschiedenen ist Standard Base 64 Encoding Alphabet) , bestehend aus:Somit beträgt die Gesamtlänge 59 bzw. 60 Bytes.
Wenn Sie das 2a-Format verwenden, benötigen Sie 60 Byte. Und so für MySQL werde ich empfehlen zu verwenden
CHAR(60) BINARY
oderBINARY(60)
(siehe Die _bin und binäre Sortierungen für Informationen über den Unterschied).CHAR
ist nicht binär sicher und Gleichheit hängt nicht nur vom Bytewert ab, sondern von der tatsächlichen Sortierung; im schlimmsten FallA
wird gleich behandelta
. Weitere Informationen finden Sie unter The_bin
undbinary
Collations .quelle
SQL_Latin1_General_CP1_CS_AS
ist in MySQL unbekannt. Was bekannt ist, istlatin1_general_cs
.2
,2a
und2y
Mittel für Hashing - Algorithmus und Format. Ich konnte mit etwas Suchen keine einfache Antwort finden.Ein Bcrypt-Hash kann in einer
BINARY(40)
Spalte gespeichert werden .BINARY(60)
Wie die anderen Antworten vermuten lassen, ist dies die einfachste und natürlichste Wahl. Wenn Sie jedoch die Speichereffizienz maximieren möchten, können Sie 20 Byte einsparen, indem Sie den Hash verlustfrei dekonstruieren. Ich habe dies auf GitHub ausführlicher dokumentiert: https://github.com/ademarre/binary-mcfBcrypt-Hashes folgen einer Struktur, die als Modular Crypt Format (MCF) bezeichnet wird. Binary MCF (BMCF) decodiert diese Text-Hash-Darstellungen in eine kompaktere Binärstruktur. Im Fall von Bcrypt beträgt der resultierende binäre Hash 40 Bytes.
Gumbo hat die vier Komponenten eines Bcrypt MCF-Hashs gut erklärt:
Die Dekodierung in BMCF sieht folgendermaßen aus:
$<id>$
kann in 3 Bits dargestellt werden.<cost>$
, 04-31, kann in 5 Bits dargestellt werden. Fügen Sie diese für 1 Byte zusammen.1 + 16 + 23
Sie können mehr über den obigen Link lesen oder meine PHP-Implementierung auch auf GitHub untersuchen.
quelle
Wenn Sie PHPs
password_hash()
mit demPASSWORD_DEFAULT
Algorithmus verwenden, um den bcrypt-Hash zu generieren (von dem ich annehmen würde, dass es ein großer Prozentsatz der Leute ist, die diese Frage lesen), denken Sie daran, dass dies in Zukunft der Fall istpassword_hash()
möglicherweise ein anderer Algorithmus als Standard verwendet wird und dies daher möglich ist beeinflussen die Länge des Hash (aber es muss nicht unbedingt länger sein).Aus der Handbuchseite:
Wenn Sie bcrypt verwenden, selbst wenn Sie 1 Milliarde Benutzer haben (dh Sie konkurrieren derzeit mit Facebook), um 255-Byte-Passwort-Hashes zu speichern, werden nur ~ 255 GB Daten gespeichert - ungefähr so groß wie eine kleine SSD-Festplatte. Es ist äußerst unwahrscheinlich, dass das Speichern des Kennwort-Hash der Engpass in Ihrer Anwendung ist. Doch in den unwahrscheinlichen Fall, dass Speicherplatz wirklich ist ein Problem , aus irgendeinem Grunde, können Sie verwenden ,
PASSWORD_BCRYPT
um Kraftpassword_hash()
zu verwenden bcrypt, auch wenn das nicht der Standard. Bleiben Sie auf jeden Fall über Schwachstellen in bcrypt auf dem Laufenden und lesen Sie die Versionshinweise jedes Mal, wenn eine neue PHP-Version veröffentlicht wird. Wenn der Standardalgorithmus jemals geändert wird, sollten Sie überprüfen, warum und eine fundierte Entscheidung treffen, ob Sie den neuen Algorithmus verwenden oder nicht.quelle
Ich glaube nicht, dass es nette Tricks gibt, mit denen Sie dies speichern können, wie Sie es beispielsweise mit einem MD5-Hash tun können.
Ich denke, Ihre beste Wette ist es, es als zu speichern,
CHAR(60)
da es immer 60 Zeichen lang istquelle