Erzeugung eines Salzes in PHP
Was ist die beste Methode zum generieren einer kryptografisch sicheren 32 bytes Salz in PHP, ohne je auf Bibliotheken selten enthalten in typischen PHP-Installation?
Nach etwas googlen habe ich entdeckt, dass mt_rand
ist nicht als sicher genug, aber ich habe nicht gefunden, einen Vorschlag für einen Ersatz. Ein Artikel empfohlene Lektüre von /dev/random
aber nicht nur das funktioniert nicht unter windows; es ist auch sehr langsam.
Ich will eine vernünftige balance zwischen Sicherheit und Geschwindigkeit (dh, es sollte nicht 20 Sekunden zum generieren von 512 bytes, wie /dev/random
gewöhnlich tut),
/dev/urandom
kann verwendet werden, für eine schnellere generation, aber immer noch nicht funktionieren auf Windows-Systemen.InformationsquelleAutor qster | 2010-03-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie vielleicht einen Blick auf die Dokumentation (und Kommentare) für
mcrypt_create_iv()
.InformationsquelleAutor Amber
Dies ist einfacher in PHP 7:
Verwenden Sie einfach
$salt = random_bytes($numberOfDesiredBytes);
zu generieren Salz.Was brauchst du ein Salz, das trotzdem? Wenn es für Passwörter, verwenden Sie einfach
password_hash()
undpassword_verify()
.InformationsquelleAutor Scott Arciszewski
Können Sie die Funktion
mycrypt_create_iv()
seit PHP-Version 5.3 verwendet es auch die random source auf einem Windows server (nicht nur unter Unix). Bevor Sie es verwenden, sollten Sie überprüfen, ob die KonstanteMCRYPT_DEV_URANDOM
definiert ist.Im Gegensatz zu random, urandom nicht die den server blockieren, wenn es ist nicht genug Entropie verfügbar. Da das Passwort Salz sollte eindeutig sein (nicht unbedingt zufällig), urandom scheint eine gute Wahl für mich.
MCRYPT_DEV_URANDOM
ist die Standardeinstellung - also, wenn Sie nicht es ändern möchten, können Sie genauso gut tunmcrypt_create_iv($length)
. Mehr über diese Funktion wird implementiert in dermcrypt
- Erweiterung, die möglicherweise oder möglicherweise nicht auf dem server installiert werden. Schließlich, das Ergebnis dieser Funktion ist eine binäre Zeichenkette, die oft nicht, was Sie brauchen, wie Sie wollen, speichern Sie das Salz für die Referenzierung später. Ich in der Regelbase64_encode
das Ergebnis, bevor Sie es als ein Salz.Das sind gute Punkte. Zudem braucht man zu prüfen, in welcher form das Salz ist zu erwarten. BCrypt zum Beispiel nicht akzeptieren, wird eine Binär-Salz, aber eine base64-codierte Salz nicht gelten weder. Für die Passwort-hashing ist es am besten, um mit der eingebauten Funktion password_hash(), das erzeugt eine sichere Salz auf Ihrer eigenen.
Ein Grund, nicht zu verwenden
password_hash()
ist, dass ich nicht die Umsetzung ein Passwort. Ich brauche ein Salz Implementierung einer stateless "api-key" - Stil authorization protocol.Darüber hinaus password_hash() ist nicht auf allen Servern verfügbar. Mein server zum Beispiel, ist fest auf php 5.3. password_hash() ist nicht verfügbar, bis 5.5.
Dies sollte kein problem sein, es ist ein compatibility pack 5.3.7 und höher. Mit einem kleinen tweak kann es auch verwendet werden mit 5.3.
InformationsquelleAutor martinstoeckli
uniqueid
ist nicht gut geeignet für die Generierung einer zufälligen Zeichenfolge, als es zumicrotime
basiert.Ein CPU-Zyklus ist in der Regel viel kürzer als ein microtime-tick, die führen können, um mögliche Beständigkeit für eine bestimmte variable innerhalb von Schleifen.
Der zweite parameter "Entropie" zu wahren,
einen höheren Zufälligkeit.
Um eine zufällige Zeichenfolge, die ist auch kompatibel mit den meisten Zeichen-sets,kann man anwenden, base64-Codierung, um die mcrypt initilization Vektor-Funktion
mcrypt_create_iv
:Reduzierung der Zeichen-alphabet zu 2^6Bit erhöht die Größe, entfielen oben.
InformationsquelleAutor Lorenz Lo Sauer
Lesen von
/dev/urandom
oder verwendenopenssl_random_pseudo_bytes()
.InformationsquelleAutor D.W.
uniqid() sollte in Ordnung sein für diesen Zweck.
InformationsquelleAutor Crozin
Ich denke
microtime()
ist genug.Seltsam, aber ich bin noch immer downvotes für diese Antwort.
Obwohl die einzige Erklärung, die ich bekommen ist, dass microtime vorhersehbar ist.
Es klingt Fremd für mich, da Salz immer davon ausgegangen, wie offen bekannt - es ist also nicht für die Prognose überhaupt.
Sie können es verwenden, wie random number generator. Und bekommen Sie eine beliebige Anzahl von bytes, die Sie wollen. Und es ist nicht die aktuelle Zeit, die Sie es versaut mit der Zeit(). Mikrosekunden ändern sich ziemlich schnell. Und es ist nur Salz, brauchen Sie nicht zu viel Sicherheit auf Salz.
Führen Sie
echo microtime()
durch eine for-Schleife (10 Schleifen ist in Ordnung) und sehen Sie, wie falsch Sie sind...Seltsam, aber einige Kommentare enthalten einen Widerspruch, der sogar in einer einzigen Zeile: "es ist, aktuelle Zeit[Stempel] aber ich kann Sie nicht 32 bytes". Ich habe immer gedacht, dass unix-timestamp ist ein 32-bit-Zahl, genau.
bits sind nicht bytes.
InformationsquelleAutor Your Common Sense