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

KB

I'm a student at TUM in Computer Science & Pizza eating. Passionate for SRE, beautiful Code and Club Mate.

Leave a Reply