Wer eine Web-Anwendung, die zwecks Authentifizierung Passwörter speichert, betreibt, der sollte sich – zwecks Sicherheit – Gedanken machen, welche kryptologische Hashfunktion die Anwendung zwecks Speicherung verwendet – schließlich soll bspw. ein eventueller Datenklau nicht gleich die betroffenen Konten vollständig kompromittieren.
Hintergrund: Wer ein Passwort (im Klartext) kennt, der gibt es einfach an der entsprechenden Stelle ein und hat Gewalt über das entsprechende Konto. Wer “nur” einen Hash des Passwortes hat, muss letztgenanntes erst via Brute-Force mühsam erraten.
Um letztgenannte Methode zusätzlich zu erschweren – und damit weniger attraktiv zu machen, habe ich folgende PHP-Funktion geschrieben:
function hashPasswordLikeABoss($password) {
if (CRYPT_SHA512 !== 1)
throw new Exception('This platform doesn\'t support the algorithm `CRYPT_SHA512\'');
if (false === ($salt = openssl_random_pseudo_bytes(12)))
throw new Exception('Failed at openssl_random_pseudo_bytes()');
$salt = sprintf(
'$6$rounds=%d$%s',
mt_rand(50000, 100000),
str_replace('+', '.', base64_encode($salt))
);
if ($salt !== substr(
$hashed = crypt($password, $salt),
0,
strlen($salt)
))
throw new Exception('Failed at crypt()');
return $hashed;
}
Erklärung
Zuerst wird überprüft, ob der zu verwendende SHA512-Algorithmus von der ausführenden Plattform überhaupt unterstützt wird.
Danach werden via openssl_random_pseudo_bytes()
12 zufällige Bytes für den Salt angefordert. (Das kann ebenfalls fehlschlagen.)
Aus denen werden daraufhin 16 – dank base64_encode()
. Dieser Funktionsaufruf dient hauptsächlich dazu, nur die für den Salt zulässigen Zeichen a-zA-Z0-9./
übrig zu lassen. Lediglich eventuelle `+’-Zeichen müssen noch durch Punkte ersetzt werden.
Um noch einen drauf zu setzen, werden zwischen 50000 und 100000 Runden verwendet – statt standartmäßig 5000.
Daraufhin wird der mit sprintf()
zusammen gebaute Salt – zusammen mit dem Passwort – an crypt()
übergeben und es wird überprüft, ob das Resultat mit dem übergebenen Salt beginnt, was für einen Erfolg spricht.
Zuletzt wird das gehashte Passwort zurückgegeben.
Fazit
Ob das die NSA von irgendwas abhält, kann ich nicht beurteilen – gegen den random (bad) Guy dürfte es aber allemal reichen.
0 Comments