Wie benutzt man bcrypt zum Hashing von Passwörtern in PHP?



3 Answers

Also, willst du bcrypt benutzen? Genial! Wie in anderen Bereichen der Kryptographie sollten Sie dies jedoch nicht selbst tun. Wenn Sie sich um die Verwaltung von Schlüsseln oder das Speichern von Salzen oder das Generieren von Zufallszahlen sorgen müssen, tun Sie es falsch.

Der Grund ist einfach: Es ist so einfach, bcrypt zu vermasseln . In der Tat, wenn Sie sich fast jedes Stück Code auf dieser Seite ansehen, werden Sie bemerken, dass es mindestens eines dieser üblichen Probleme verletzt.

Stellen Sie es, Kryptografie ist schwer.

Überlassen Sie es den Experten. Überlassen Sie es den Leuten, deren Aufgabe es ist, diese Bibliotheken zu pflegen. Wenn Sie eine Entscheidung treffen müssen, tun Sie es falsch.

Verwenden Sie stattdessen einfach eine Bibliothek. Abhängig von Ihren Anforderungen existieren mehrere.

Bibliotheken

Im Folgenden finden Sie eine Aufschlüsselung einiger der gängigsten APIs.

PHP 5.5 API - (Verfügbar für 5.3.7+)

Ab PHP 5.5 wird eine neue API zum Hashing von Passwörtern eingeführt. Es gibt auch eine Shimkompatibilitätsbibliothek (von mir) für 5.3.7+. Dies hat den Vorteil, dass es sich um eine von Experten geprüfte und einfach zu verwendende Implementierung handelt.

function register($username, $password) {
    $hash = password_hash($password, PASSWORD_BCRYPT);
    save($username, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    if (password_verify($password, $hash)) {
        //login
    } else {
        // failure
    }
}

Wirklich, es zielt darauf ab, extrem einfach zu sein.

Ressourcen:

Zend \ Crypt \ Passwort \ Bcrypt (5.3.2+)

Dies ist eine andere API, die der PHP 5.5 ähnlich ist und einen ähnlichen Zweck erfüllt.

function register($username, $password) {
    $bcrypt = new Zend\Crypt\Password\Bcrypt();
    $hash = $bcrypt->create($password);
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $bcrypt = new Zend\Crypt\Password\Bcrypt();
    if ($bcrypt->verify($password, $hash)) {
        //login
    } else {
        // failure
    }
}

Ressourcen:

PasswortLib

Dies ist ein etwas anderer Ansatz für das Password Hashing. Anstatt bcrypt einfach zu unterstützen, unterstützt PasswordLib eine große Anzahl von Hashing-Algorithmen. Es ist hauptsächlich in Kontexten nützlich, in denen Sie die Kompatibilität mit älteren und unterschiedlichen Systemen unterstützen müssen, die sich außerhalb Ihrer Kontrolle befinden. Es unterstützt eine große Anzahl von Hashalgorithmen. Und wird unterstützt 5.3.2+

function register($username, $password) {
    $lib = new PasswordLib\PasswordLib();
    $hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $lib = new PasswordLib\PasswordLib();
    if ($lib->verifyPasswordHash($password, $hash)) {
        //login
    } else {
        // failure
    }
}

Verweise:

  • Quellcode / Dokumentation: GitHub

PHPASS

Dies ist ein Layer, der bcrypt unterstützt, aber auch einen ziemlich starken Algorithmus unterstützt, der nützlich ist, wenn Sie keinen Zugriff auf PHP> = 5.3.2 haben. Er unterstützt tatsächlich PHP 3.0+ (allerdings nicht mit bcrypt).

function register($username, $password) {
    $phpass = new PasswordHash(12, false);
    $hash = $phpass->HashPassword($password);
    save($user, $hash);
}

function login($username, $password) {
    $hash = loadHashByUsername($username);
    $phpass = new PasswordHash(12, false);
    if ($phpass->CheckPassword($password, $hash)) {
        //login
    } else {
        // failure
    }
}

Ressourcen

Hinweis: Verwenden Sie nicht die PHPASS-Alternativen, die nicht auf openwall gehostet werden, sie sind verschiedene Projekte !!!

Über BCrypt

Wenn Sie bemerken, gibt jede dieser Bibliotheken eine einzelne Zeichenfolge zurück. Das liegt daran, dass BCrypt intern funktioniert. Und es gibt eine Menge Antworten darauf. Hier ist eine Auswahl, die ich geschrieben habe, die ich hier nicht kopieren / einfügen werde, aber verlinke auf:

Einpacken

Es gibt viele verschiedene Möglichkeiten. Welches du wählst, bleibt dir überlassen. Ich würde jedoch dringend empfehlen, dass Sie eine der oben genannten Bibliotheken verwenden, um dies für Sie zu behandeln.

Wenn Sie crypt() direkt verwenden, tun Sie wahrscheinlich etwas falsch. Wenn Ihr Code hash() (oder md5() oder sha1() ) direkt verwendet, tun Sie fast definitiv etwas falsch.

Benutze einfach eine Bibliothek ...

Question

Hin und wieder höre ich den Hinweis "Benutze bcrypt zum Speichern von Passwörtern in PHP, bcrypt-Regeln".

Aber was ist bcrypt ? PHP bietet keine solchen Funktionen, Wikipedia plappert über ein Dienstprogramm zur Dateiverschlüsselung und Web-Suchen zeigen nur einige Implementierungen von Blowfish in verschiedenen Sprachen. Jetzt ist Blowfish auch in PHP über mcrypt , aber wie hilft das beim Speichern von Passwörtern? Blowfish ist eine allgemeine Chiffre, es funktioniert auf zwei Arten. Wenn es verschlüsselt werden könnte, kann es entschlüsselt werden. Passwörter benötigen eine Einweg-Hashing-Funktion.

Was ist die Erklärung?




Aktuelles Denken: Hashes sollten möglichst langsam und nicht so schnell wie möglich sein. Dies unterdrückt Rainbow-Table- Angriffe.

Auch verwandt, aber vorsorglich: Ein Angreifer sollte niemals uneingeschränkten Zugriff auf Ihren Anmeldebildschirm haben. Um dies zu verhindern: Richten Sie eine IP-Adressen-Verfolgungstabelle ein, die jeden Treffer zusammen mit dem URI aufzeichnet. Wenn mehr als 5 Anmeldeversuche von derselben IP-Adresse in einem Zeitraum von fünf Minuten kommen, blockieren Sie mit einer Erläuterung. Ein sekundärer Ansatz besteht darin, ein zweistufiges Passwortschema zu verwenden, wie dies Banken tun. Eine Sperre für Fehler im zweiten Durchgang erhöht die Sicherheit.

Zusammenfassung: Verlangsamen Sie den Angreifer, indem Sie zeitraubende Hash-Funktionen verwenden. Blockieren Sie auch zu viele Zugriffe auf Ihr Login und fügen Sie eine zweite Passwort-Ebene hinzu.




Version 5.5 von PHP wird integrierte Unterstützung für BCrypt, die Funktionen password_hash() und password_verify() . Eigentlich sind dies nur Wrapper um die Funktion crypt() und sollen es einfacher machen, sie richtig zu benutzen. Es sorgt für die Erzeugung eines sicheren Zufallssalzes und liefert gute Standardwerte.

Der einfachste Weg, diese Funktionen zu verwenden, ist:

$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

Dieser Code hasht das Passwort mit BCrypt (Algorithmus 2y ), generiert ein zufälliges Salz aus der Zufallsquelle des Betriebssystems und verwendet den Standardkostenparameter (im Moment ist dies 10). Die zweite Zeile prüft, ob das eingegebene Passwort mit einem bereits gespeicherten Hash-Wert übereinstimmt.

Wenn Sie den Kostenparameter ändern möchten, können Sie dies tun, indem Sie den Kostenparameter um 1 erhöhen, die benötigte Zeit für die Berechnung des Hashwerts verdoppelt:

$hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));

Im Gegensatz zum Parameter "cost" ist es besser, den Parameter "salt" wegzulassen, da die Funktion bereits versucht, ein kryptographisch sicheres Salz zu erzeugen.

Für PHP Version 5.3.7 und höher gibt es ein Kompatibilitäts-Paket , von demselben Autor, der die Funktion password_hash() hat. Für PHP-Versionen vor 5.3.7 gibt es keine Unterstützung für crypt() mit 2y , dem unicode-sicheren BCrypt-Algorithmus. Man könnte es stattdessen durch 2a ersetzen, was die beste Alternative für frühere PHP-Versionen ist.




Sie können einen Einweg-Hash mit bcrypt erstellen, indem Sie die crypt() -Funktion von PHP verwenden und ein entsprechendes Blowfish-Salz übergeben. Die wichtigste der ganzen Gleichung ist, dass A) der Algorithmus nicht kompromittiert wurde und B) Sie jedes Passwort richtig salzen . Verwenden Sie kein anwendungsweites Salz; Das öffnet Ihre gesamte Anwendung, um von einem einzigen Satz Rainbow-Tabellen aus anzugreifen.

PHP - Crypt-Funktion




Related