Wie man ein gutes Salz erzeugt - Ist meine Funktion sicher genug?
Hier ist die Funktion, die ich zum generieren zufälliger Salze:
function generateRandomString($nbLetters){
$randString="";
$charUniverse="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for($i=0; $i<$nbLetters; $i++){
$randInt=rand(0,61);
$randChar=$charUniverse[$randInt];
$randString=$randomString.$randChar;
}
return $randomString;
}
Dies ist für eine nicht kommerzielle website. Es ist nur verwendet, um das Salz (werden gespeichert in der db und werden zusammen mit den eingereichten pw für hashing).
Ist das in Ordnung? Sollte ich eine größere Teilmenge der Zeichen, und wenn ja, gibt es eine einfache Möglichkeit zu tun, dass in PHP?
InformationsquelleAutor der Frage JDelage | 2010-11-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie Hash-Passwörter verwenden, sollten Sie die moderne hashing-Algorithmus, die Sie nicht erfordert, erstellen Sie Ihre eigenen Salz. Mit schwachen hashing-algorithmen, stellt eine Gefahr für Sie und für Ihre Benutzer. Meine ursprüngliche Antwort wurde geschrieben, vor acht Jahren. Die Zeiten haben sich geändert und die Passwort-hashing ist viel einfacher jetzt.
Sollten Sie immer verwenden Sie die eingebauten Funktionen, um hash/check-Passwörter. Mit eigenen algorithmen zu jedem Punkt stellt eine riesige Menge von unnötigen Risiken.
Für PHP, erwägen Sie die Verwendung password_hash()mit der
PASSWORD_BCRYPT
Algorithmus. Es gibt keine Notwendigkeit, Ihre eigenen Salz.Unten ist meine ursprüngliche Antwort für die Nachwelt:
Aus der php sha1-Seite:
Sieht dies einfacher und effektiver, da jeder einzigartig ist) als das, was Sie vorgeschlagen haben.
InformationsquelleAutor der Antwort fredley
Wenn Sie auf Linux
/dev/urandom
ist wahrscheinlich die beste Quelle für Zufälligkeit. Es ist durch den mitgelieferten OS selbst, so ist es garantiert sehr viel sicherer als irgendwelche in PHP eingebaute Funktion.Dadurch erhalten Sie 32 bytes of random blob. Sie werden wahrscheinlich wollen, diesen durch so etwas wie
base64_encode()
machen es lesbar. Keine Notwendigkeit, zu jonglieren, selbst Zeichen.Edit 2014: In PHP 5.3 und höher
openssl_random_pseudo_bytes()
ist der einfachste Weg, um eine Reihe zufälliger bytes. Auf *nix-Systemen, verwendet es/dev/urandom
hinter die kulissen. Auf Windows-Systemen verwendet einen anderen Algorithmus, der in der OpenSSL-Bibliothek.Verwandte: https://security.stackexchange.com/questions/26206
Verwandte: sollte ich urandom oder openssl_random_pseudo_bytes?
InformationsquelleAutor der Antwort kijin
password_hash()
ist availble in PHP 5.5 und höher. Ich bin überrascht zu erfahren, dass es hier nicht erwähnt.Mit password_hash() es gibt keine Notwendigkeit zu erzeugen, ein Salz, da das Salz wird automatisch generiert wird mit dem bcrypt-Algorithmus-und somit nicht brauchen, um eine Menge von Zeichen.
Statt, das vom Benutzer eingegebene Passwort verglichen wird, um die einmalige Passwort-hash in der Datenbank gespeichert mit password_verify(). Nur store-Benutzernamen und Passwort-hash in der user-Datenbank-Tabelle, Sie werden dann in der Lage sein zu vergleichen, der auf eine vom Benutzer eingegebene Passwort mit password_verify().
Wie Passwort-hash()'ing funktioniert:
Den password_hash () - Funktion gibt eine eindeutige Kennwort-hash-Werte, die beim speichern des Strings in eine Datenbank-es wird empfohlen, dass die Spalte erlaubt bis zu 255 Zeichen.
Überprüfen einer Hash-Passwort, die Sie verwenden
password_verify()
:Wenn Sie es vorziehen, mit Salz Hinzugefügt werden können manuell, als option, etwa so:
InformationsquelleAutor der Antwort Kristoffer Bohmann
Ersetzen
rand(0,61)
mitmt_rand(0, 61)
und Sie sollten in Ordnung sein (Damt_rand
besser ist auf die Herstellung von Zufallszahlen)...Aber wichtiger als die Kraft des Salzes ist die Art, wie Sie hash. Wenn Sie eine große Salz routine, aber nur
md5($pass.$salt)
Sie wegwerfen das Salz. Ich persönlich empfehle Dehnung der hash... Zum Beispiel:Weitere Informationen über hash-stretching, check-out diese SO beantworten...
InformationsquelleAutor der Antwort ircmaxell
Ich würde einen Rat annehmen, von einem anderen die Antwort und verwenden Sie mt_rand(0, 61)weil der Mersenne Twister erzeugt bessere Entropie.
Darüber hinaus Ihre Funktion ist wirklich zwei teilen: Erzeugung von Zufallszahlen
$nbLetters
Ziffern und Codierung, die in base62. Das macht die Sache viel klarer, um ein maintenance-Programmierer (vielleicht Sie!) wer stolpert Sie über ein paar Jahre auf der Straße:InformationsquelleAutor der Antwort Drew Stephens
Dies ist meine Methode, verwendet Es echte Zufallszahlen aus den atmosphärischen Rauschen. Es ist alles gemischt mit pseudo-random-Werte und strings. Gemischt und Hash. Hier ist mein code: ich nenne es übertrieben.
Dem atmosphärischen Rauschen wird durch random.org. Ich habe auch gesehen, wirklich zufällige Generierung von Bildern von lava-Lampen interpretiert werden, die über den Farbton und die Lage. (Farbton Lage)
InformationsquelleAutor der Antwort
Hier ist ein viel besserer Weg, wenn Sie windows und nicht /dev/random.
InformationsquelleAutor der Antwort tor
Ich denke, dass ein sehr gutes Salz zum Beispiel ist der Benutzername (wenn Sie reden über den pw-Hash und den user Namen nicht ändern.)
Brauchen Sie nicht zu erzeugen etwas und nicht brauchen, um die Speicherung weiterer Daten.
InformationsquelleAutor der Antwort NikiC
Einer relativ einfachen Technik:
Im Gegensatz zu uniqid() generiert einen zufälligen Ergebnis.
InformationsquelleAutor der Antwort Jay
Benutze ich dieses:
InformationsquelleAutor der Antwort William Wallace
Wenn Sie wollen ultimate einzigartigen Salz, die Sie verwenden sollten ein eindeutiger Wert eingegeben werden und die der Benutzer benötigt, wie E-Mail oder den Benutzernamen, dann hashing mit sha1 und dann Zusammenführen - verketten - mit der salt-Wert generiert den code.
Anderen, die Sie haben zu verlängern
$charUniverse
durch den Mittelwert von einigen Sonderzeichen, wie@,!#-
etc.InformationsquelleAutor der Antwort SaidbakR