Sie möchten also bcrypt verwenden? Genial! Wie in anderen Bereichen der Kryptographie sollten Sie dies jedoch nicht selbst tun. Wenn Sie sich Gedanken über die Verwaltung von Schlüsseln, das Speichern von Salzen oder das Generieren von Zufallszahlen machen müssen, machen Sie es falsch.
Der Grund ist einfach: Es ist so einfach, bcrypt zu vermasseln . Wenn Sie sich fast jeden Code auf dieser Seite ansehen, werden Sie feststellen, dass mindestens eines dieser häufigen Probleme verletzt wird.
Seien Sie ehrlich, Kryptographie ist schwer.
Überlassen Sie es den Experten. Überlassen Sie es den Personen, deren Aufgabe es ist, diese Bibliotheken zu pflegen. Wenn Sie eine Entscheidung treffen müssen, machen Sie es falsch.
Verwenden Sie stattdessen einfach eine Bibliothek. Je nach Ihren Anforderungen gibt es mehrere.
Bibliotheken
Hier 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 Shim-Kompatibilitätsbibliothek, die (von mir) für 5.3.7+ verwaltet wird. Dies hat den Vorteil, dass es sich um eine von Experten überprü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 soll extrem einfach sein.
Ressourcen:
Zend \ Crypt \ Password \ Bcrypt (5.3.2+)
Dies ist eine weitere API, die der von PHP 5.5 ähnelt 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:
PasswordLib
Dies ist ein etwas anderer Ansatz für das Passwort-Hashing. PasswordLib unterstützt nicht nur bcrypt, sondern auch eine Vielzahl von Hashing-Algorithmen. Dies ist vor allem in Kontexten nützlich, in denen Sie die Kompatibilität mit älteren und unterschiedlichen Systemen unterstützen müssen, die möglicherweise außerhalb Ihrer Kontrolle liegen. Es unterstützt eine große Anzahl von Hashing-Algorithmen. Und wird 5.3.2+ unterstützt
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 eine Ebene, die 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 ... Sie unterstützt tatsächlich PHP 3.0+ (obwohl 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 keine PHPASS-Alternativen, die nicht auf Openwall gehostet werden, sondern unterschiedliche Projekte !!!
Über BCrypt
Wenn Sie bemerken, gibt jede dieser Bibliotheken eine einzelne Zeichenfolge zurück. Das liegt daran, wie BCrypt intern funktioniert. Und dazu gibt es eine Menge Antworten. Hier ist eine Auswahl, die ich geschrieben habe und die ich hier nicht kopieren / einfügen werde, sondern auf Folgendes verweise:
Einpacken
Es gibt viele verschiedene Möglichkeiten. Welche Sie wählen, liegt bei Ihnen. Ich würde jedoch dringend empfehlen, dass Sie eine der oben genannten Bibliotheken verwenden, um dies für Sie zu erledigen .
Wenn Sie crypt()
direkt verwenden, machen Sie wahrscheinlich etwas falsch. Wenn Ihr Code direkt hash()
(oder md5()
oder sha1()
) verwendet, machen Sie mit ziemlicher Sicherheit etwas falsch.
Verwenden Sie einfach eine Bibliothek ...