PHP Passwort Sicherheit und Hashes 2

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.

Published by

Kordian Bruck

I'm a TUM Computer Science Alumni. Pizza enthusiast. Passionate for SRE, beautiful Code and Club Mate. Currently working as an SRE at Google. Opinions and statements in this blog post are my own.

Leave a Reply