Ich baue eine Anwendung, die eine Benutzerbasis haben wird, und ich bin an dem Punkt der Sicherung der Anmeldung. Ich bin ziemlich neu in der Programmierung (und PHP), aber meine Bemühungen bisher haben darauf hingewiesen, mit Crypt()
und ein Blowfish-gehashtes Salz.
Bevor ich fortfahre, möchte ich klarstellen, dass Ich bin nicht an phpass interessiert. zu diesem Zeitpunkt.
Innerhalb der crypt()
Dokumentation hat ein Benutzer vor kurzem folgendes gepostet:
<?php
$salt = substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22);
?>
Es ist für die Verwendung auf Systemen vorgesehen wo mt_getrandmax() == 2147483647.
Das erzeugte Salz wird 128 Länge, wird auf 132 Bit aufgefüllt und dann in 22 base64-Zeichen ausgedrückt. (CRYPT_BLOWFISH verwendet 128 Bits nur für für das Salt, obwohl 132 Bits in 22 Bits in 22 base64-Zeichen enthalten sind. Wenn Sie die CRYPT_BLOWFISH-Eingabe und -Ausgabe untersuchen Ausgabe untersuchen, können Sie sehen, dass es die die letzten vier Bits bei der Eingabe ignoriert und bei der Ausgabe auf Null setzt).
N vier 32-Bit-Wörter, die von mt mt_getrandmax == 2^31), so dass nur 124 der der 128 Bits pseudozufällig sein werden. I fand das akzeptabel für meine Anwendung akzeptabel.
Ich habe meinen Server getestet, und tatsächlich gibt mt_getrandmax() 2147483647 zurück. Ich habe versucht, in der Dokumentation herumzustochern, um zu verstehen, was der obige Code wirklich tut - die pack()
Code N4 steht für eine 32-Bit-Zeichenkette (Big-Endian-Bytereihenfolge??), die 4 Mal wiederholt wird... deshalb gibt es wohl auch 4 mt_rand()
Argumente.
Was ich nicht verstehe, ist, warum er die +
con .
und den Zweck von 22 base64-Zeichen (nicht, dass ich ganz verstehe, was base64 ist).
Es wurde mir empfohlen, mich mit folgenden Themen zu befassen openssl_random_pseudo_bytes()
für meine zufällige Salzgenerierung, da die vorherige Methode, die ich mir angesehen habe, sich nur auf 1234567890abcdefghijklmnopqrstuvwxyz
.
Angeblich gab es einen Fehler vor 5.3.4 verursacht openssl_random_pseudo_bytes()
schmerzhaft langsam und verursacht gelegentlich Timeout-Fehler. Ich bin nicht sicher, ob ich versuchen sollte, mit openssl_random_pseudo_bytes()
con Crypt()
oder etwas Ähnliches wie die obige Methode mit mt_rand()
y pack()
.
Ich versuche, mehr zu verstehen, wie all diese Elemente funktionieren und was sie konzeptionell tun - anstatt nur eines zu verwenden, ohne es zu verstehen, um mein Ziel zu erreichen; ich versuche zu lernen :P
Kann mir jemand helfen, die verschiedenen Elemente zu verstehen, die hier eine Rolle spielen, oder mich zumindest auf eine Wissensdatenbank verweisen, in der ich darüber lesen kann? Ich denke, die schwierigste Komponente ist das Verständnis der verschiedenen Formate/Terminologie (base64, ascii, hexdec, bit, byte usw.), aber letztendlich auch, wie ich ein einigermaßen sicheres Salt für meine Passwörter bekomme.