Hallo,
$salt='';
for ($i=0; $i<PASSWD_SALT_LENGHT; $i++) {
$salt .= chr( rand( 33, 125 ) ); # ascii von '!' bis '}' # OHNE '~'!
rand() ist meines Wissens keine zuverlässige Quelle für Zufallszahlen zur Verwendung in kryptografischen Verfahren. Dafür gibt es m.W. mycrpt_create_iv oder openssl_random_pseudo_bytes. Aber darauf würde ich nicht vertrauen, sondern eine fertige Bibliothek verwenden. Wenn man die falsch verwendet, reduziert man unter Umständen die Entropie dramatisch.
Wenn man von Krypto wenig Ahnung hat, sollte man besser Bibliotheken und Funktionen von Leuten verwenden, die wissen, was sie tun.
Wenn man aber von Kryptographie so fürchterlich viel Ahnung hat, dass man anderen "so locker vom hohen Hocker" Ahnungslosigkeit vorwerfen kann
Lieber Jörg, ich werfe hier niemandem etwas vor. Ich habe wenig Ahnung von Kryptographie und anscheinend hast du etwa gleich wenig Ahnung. Hier bewegt sich i.d.R. niemand, der wirklich Ahnung von Krypto hat. Deshalb halte ich es für kontraproduktiv, hier selbstgebastelte Funktionen zu posten.
Als Entwickler von Webanwendungen versuchen ich die Verfahren anzuwenden, die Krypto-Experten empfehlen, und die Bibliotheken zu verwenden, die Krypto-Experten entwickelt haben. Nicht mehr und nicht weniger. Ich verstehe nicht, warum man sich nicht eingestehen kann, dass man von Kryptografie Marke Eigenbau besser die Finger lassen sollte, wenn man kein wirklich fundiertes Wissen hat. Das ist nicht speziell an dich gerichtet, sondern an alle Beteiligten.
Du knallst den Lesern ein paar Begriffe und Funktionen um die Ohren
Nein. Ich habe dazu geraten, ausgereifte Bibliotheken und fertige Funktionen zu verwenden. Das kannst du in meinem Post nachlesen. Sven hat bereits auf eine Bibliothek hingewiesen, die password_hash auch für ältere PHPs bereitstellt. Darauf will ich hinaus.
Zum Beispiel dürfte bei Befolgen Deines Vorschlages ein $hash=hash_pbkdf2 ('md5' , $passwd , '' , 1) nämlich nur wenig bringen, wäre sogar kontraproduktiv
Bitte was? Ich habe diesen Vorschlag nicht gemacht, ich habe lediglich auf den Algorithmus und seine Implementierung in PHP hingewiesen.
Ja, hash_pbkdf2 ist keine einfach verwendbare Funktion, weil sie im Gegensatz zu password_hash einen Salt erwartet. Das bringt einen in die Verlegenheit, selbst einen Zufallswert berechnen zu müssen – das sollte man besser nicht tun (siehe oben).
Die Funktionen sind so ziemlich schwarze Boxen. Was, wenn ich eines Tages von PHP auf eine andere Sprache umstellen will oder muss? In der es hash_pbkdf2() nicht gibt?
Jetzt ist aber gut. PBKDF2 ist ein Internetstandard und Implementierungen gibt es in jeder großen Programmiersprache. Dasselbe gilt für bcrypt.
Mathias