Alors, vous voulez utiliser bcrypt? Impressionnant! Cependant, comme dans d'autres domaines de la cryptographie, vous ne devriez pas le faire vous-même. Si vous devez vous soucier de gérer des clés, de stocker des sels ou de générer des nombres aléatoires, vous vous trompez.
La raison est simple: il est si facile de visser bcrypt . En fait, si vous regardez presque chaque morceau de code sur cette page, vous remarquerez qu'il viole au moins un de ces problèmes courants.
Avouons-le, la cryptographie est difficile.
Laissez-le aux experts. Laissez-le aux personnes dont le travail consiste à entretenir ces bibliothèques. Si vous devez prendre une décision, vous vous trompez.
Utilisez plutôt une bibliothèque. Plusieurs existent selon vos besoins.
Bibliothèques
Voici une ventilation de certaines des API les plus courantes.
API PHP 5.5 - (Disponible pour 5.3.7+)
Depuis PHP 5.5, une nouvelle API de hachage des mots de passe est en cours d'introduction. Il existe également une bibliothèque de compatibilité de shim maintenue (par moi) pour 5.3.7+. Cela a l'avantage d'être une implémentation évaluée par les pairs et simple à utiliser.
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
}
}
Vraiment, il vise à être extrêmement simple.
Ressources:
Zend \ Crypt \ Password \ Bcrypt (5.3.2+)
Il s'agit d'une autre API similaire à celle de PHP 5.5 et remplit une fonction similaire.
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
}
}
Ressources:
PasswordLib
Il s'agit d'une approche légèrement différente du hachage de mot de passe. Plutôt que de simplement prendre en charge bcrypt, PasswordLib prend en charge un grand nombre d'algorithmes de hachage. Il est principalement utile dans les contextes où vous devez prendre en charge la compatibilité avec les systèmes hérités et disparates qui peuvent être hors de votre contrôle. Il prend en charge un grand nombre d'algorithmes de hachage. Et est pris en charge 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
}
}
Références:
- Code source / documentation: GitHub
PHPASS
C'est une couche qui prend en charge bcrypt, mais prend également en charge un algorithme assez puissant qui est utile si vous n'avez pas accès à PHP> = 5.3.2 ... Il prend en charge PHP 3.0+ (mais pas avec 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
}
}
Ressources
Remarque: N'utilisez pas les alternatives PHPASS qui ne sont pas hébergées sur openwall, ce sont des projets différents !!!
À propos de BCrypt
Si vous remarquez, chacune de ces bibliothèques renvoie une seule chaîne. C'est à cause de la façon dont BCrypt fonctionne en interne. Et il y a des tonnes de réponses à ce sujet. Voici une sélection que j'ai écrite, que je ne copierai / collerai pas ici, mais un lien vers:
Emballer
Il existe de nombreux choix différents. Le choix vous appartient. Cependant, je vous recommande fortement d'utiliser l'une des bibliothèques ci-dessus pour gérer cela pour vous.
Encore une fois, si vous utilisez crypt()
directement, vous faites probablement quelque chose de mal. Si votre code utilise directement hash()
(ou md5()
ou sha1()
), vous faites certainement quelque chose de mal.
Utilisez simplement une bibliothèque ...