Der einfachste Weg, um Ihr Passwortspeicherschema sicher zu machen, ist die Verwendung einer Standardbibliothek .
Da die Sicherheit in der Regel viel komplizierter ist und unsichtbarere Möglichkeiten bietet, als die meisten Programmierer allein in Angriff nehmen könnten, ist die Verwendung einer Standardbibliothek fast immer die einfachste und sicherste (wenn nicht die einzige) verfügbare Option.
Die neue PHP-Passwort-API (5.5.0+)
Wenn Sie PHP Version 5.5.0 oder höher verwenden, können Sie die neue vereinfachte Passwort-Hashing-API verwenden
Beispiel für Code mit der PHP-Passwort-API:
<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);
// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
(Falls Sie noch Legacy 5.3.7 oder höher verwenden, können Sie ircmaxell / password_compat installieren , um Zugriff auf die integrierten Funktionen zu erhalten.)
Verbesserung der gesalzenen Hashes: Pfeffer hinzufügen
Wenn Sie zusätzliche Sicherheit wünschen, empfehlen die Sicherheitsleute jetzt (2017) , den (automatisch) gesalzenen Passwort-Hashes einen " Pfeffer " hinzuzufügen .
Es gibt eine einfache Drop-in-Klasse, die dieses Muster sicher implementiert. Ich empfehle:
Netsilik / PepperedPasswords
( github ).
Es wird mit einer MIT-Lizenz geliefert, sodass Sie es auch in proprietären Projekten verwenden können, wie Sie möchten.
Beispiel für Code mit Netsilik/PepperedPasswords
:
<?php
use Netsilik/Lib/PepperedPasswords;
// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');
$hasher = new PepperedPasswords($config['pepper']);
// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);
// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
Die ALTE Standardbibliothek
Bitte beachten Sie : Sie sollten dies nicht mehr benötigen! Dies ist nur aus historischen Gründen hier.
Schauen Sie sich an: Portable PHP Password Hashing Framework : phpass und stellen Sie sicher, dass Sie den CRYPT_BLOWFISH
Algorithmus verwenden, wenn dies überhaupt möglich ist.
Beispiel für Code mit phpass (v0.2):
<?php
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );
// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
PHPass wurde in einigen bekannten Projekten implementiert:
- phpBB3
- WordPress 2.5+ sowie bbPress
- die Drupal 7-Version (Modul verfügbar für Drupal 5 & 6)
- Andere
Das Gute ist, dass Sie sich keine Gedanken über die Details machen müssen. Diese Details wurden von erfahrenen Personen programmiert und von vielen Leuten im Internet überprüft.
Weitere Informationen zu Kennwortspeicherschemata finden Sie in Jeffs Blogbeitrag: Sie speichern Kennwörter wahrscheinlich falsch
Was auch immer Sie tun, wenn Sie sich für den Ansatz " Ich mache es selbst, danke " entscheiden, verwenden Sie ihn nicht mehr MD5
oder SHA1
nicht mehr . Sie sind nette Hashing-Algorithmen, werden aber aus Sicherheitsgründen als defekt angesehen .
Derzeit ist die Verwendung von Krypta mit CRYPT_BLOWFISH die beste Vorgehensweise.
CRYPT_BLOWFISH in PHP ist eine Implementierung des Bcrypt-Hash. Bcrypt basiert auf der Blowfish-Blockverschlüsselung und nutzt das teure Schlüssel-Setup, um den Algorithmus zu verlangsamen.