Ich hab mal ein bisschen herumprobiert und interessante Ergebnisse bekommen:
SHA-512: 0.0001068115234375 Bcrypt: 4.3771350383759 Sha1: 3.3855438232422E-5 Md5: 1.5020370483398E-5
< ?php function bcrypt_encode($password, $rounds='12'){ $salt = substr(str_shuffle('./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 22); return crypt($password, '$2a$'.$rounds.'$'.$salt); } function bcrypt_check($password, $stored){ return crypt($password, substr($stored, 0, 30)) == $stored; } $start = microtime(true); for($i = 0; $i < 10; $i++){ $x = hash("sha512", "123456"); } $end = microtime(true); echo 'SHA-512: '.($end - $start).' '; $start = microtime(true); for($i = 0; $i < 10; $i++){ $x = bcrypt_encode('123456'); } $end = microtime(true); echo 'Bcrypt: '.($end - $start).' '; $start = microtime(true); for($i = 0; $i < 10; $i++){ $x = sha1("123456"); } $end = microtime(true); echo 'Sha1: '.($end - $start).' '; $start = microtime(true); for($i = 0; $i < 10; $i++){ $x = md5("123456"); } $end = microtime(true); echo 'Md5: '.($end - $start).' ';
Also wie man merkt, ist MD5 & SHA-1 wirklich auf Geschwindigkeit optimiert. Ich verwende hier abgeänderte Funktionen von hier, ohne die Einbindung der Email in den Hash. Mit 12 Iterationen bei bcrypt erreicht man schon sehr hohe Berechnungszeiten und kann dies noch natürlich steigern, allerdings ist die Frage, ab wann sich das noch lohnt. Einen Nutzer 10 Sekunden beim Login warten zu lassen ist nicht sehr Klug und auch eher verschwenderisch von den Ressourcen her. Hier ist ein Mittelweg zu finden.