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.

Alexander Klimov

Autor: Alexander Aleksandrovič Klimov

Alexander hat Ende 2013 mit einem Praktikum bei NETWAYS gestartet. Als leidenschaftlicher Programmierer und begeisterter Anhänger der Idee freier Software, hat er sich dabei innerhalb kürzester Zeit in die Herzen seiner Kollegen im Development geschlichen. Wäre nicht ausgerechnet Gandhi sein Vorbild, würde er von dort aus daran arbeiten, seinen geheimen Plan, erst die Abteilung und dann die Weltherrschaft an sich zu reißen, zu realisieren - tut er aber nicht. Stattdessen beschreitet er mit der Arbeit an Icinga Web 2 und seiner Ausbildung bei uns friedliche Wege.