Donc, vous voulez utiliser bcrypt ? Génial ! Cependant, comme dans d'autres domaines de la cryptographie, vous ne devriez pas le faire vous-même. Si vous devez vous préoccuper de quelque chose comme la gestion des clés, le stockage des sels ou la génération de nombres aléatoires, vous vous y prenez mal.
La raison est simple : il est si trivialement facile de foutre en l'air bcrypt . En fait, si vous examinez la quasi-totalité du code de cette page, vous constaterez qu'il enfreint au moins l'un de ces problèmes courants.
Admettez-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 y prenez mal.
Au lieu de cela, il suffit d'utiliser une bibliothèque. Il en existe plusieurs, en fonction de vos besoins.
Bibliothèques
Voici une ventilation de certaines des API les plus courantes.
API PHP 5.5 - (Disponible pour 5.3.7+)
À partir de PHP 5.5, une nouvelle API pour le hachage des mots de passe est introduite. Il y a aussi une bibliothèque de compatibilité shim maintenue (par moi) pour 5.3.7+. Cette bibliothèque a l'avantage d'être évaluée par des pairs et d'avoir été mise à jour. simple pour utiliser la mise en œuvre.
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
}
}
En réalité, l'objectif est d'être extrêmement simple.
Ressources :
Zend \Crypt\Password\Bcrypt (5.3.2+)
C'est une autre API qui est similaire à celle de PHP 5.5, et qui a un but 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 des mots de passe. Plutôt que de supporter simplement bcrypt, PasswordLib supporte un grand nombre d'algorithmes de hachage. C'est principalement utile dans les contextes où vous devez assurer la compatibilité avec des systèmes anciens et disparates qui peuvent être hors de votre contrôle. Il prend en charge un grand nombre d'algorithmes de hachage. Et est supporté à partir de la version 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 supporte bcrypt, mais aussi un algorithme assez fort qui est utile si vous n'avez pas accès à PHP >= 5.3.2... Elle supporte en fait 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
Note : N'utilisez pas les alternatives de 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 de caractères. C'est à cause de la façon dont BCrypt fonctionne en interne. Et il y a une TONNE de réponses à ce sujet. Voici une sélection de celles que j'ai écrites, que je ne copierai pas/collerai ici, mais dont je ferai le lien :
Récapitulation
Il existe de nombreux choix différents. C'est à vous de voir lequel vous choisissez. Cependant, je voudrais HAUTEMENT Nous vous recommandons 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 hash()
(ou md5()
o sha1()
) directement, vous êtes presque certainement en train de faire quelque chose de mal.
Il suffit d'utiliser une bibliothèque...
13 votes
Cette question a été abordé précédemment et leur suggestion d'utiliser une bibliothèque standard est excellente. La sécurité est un sujet compliqué, et en utilisant un paquetage conçu par quelqu'un qui sait ce qu'il fait, vous ne faites que vous aider.
61 votes
@eykanal - cette page ne mentionne même pas bcrypt, et encore moins l'expliquer. ce que c'est .
0 votes
C'est vrai. Cependant, j'ai inclus ce lien en me basant sur le titre de la question, à laquelle il est répondu dans cette question. En ce qui concerne les détails réels de bcrypt, vous pouvez consulter les documents suivants cet article de journal . Toutefois, sachez que votre question est très vaste ; vous demandez une explication sommaire de tout un domaine de recherche (que, je l'admets volontiers, je ne connais pas moi-même).
8 votes
@eykanal - Je ne demande pas d'explication sur son fonctionnement. Je veux juste savoir ce que c'est. Parce que tout ce que je peux trouver sur le net sous le mot clé "bcrypt", ne peut en aucun cas être utilisé pour hacher des mots de passe. Pas directement en tout cas, et pas en PHP. OK, je comprends maintenant qu'il s'agit en fait du paquet "phpass" qui utilise blowfish pour crypter votre mot de passe avec une clé qui est dérivée de votre mot de passe (en fait, le mot de passe est crypté avec lui-même). Mais le référencer comme "bcrypt" est gravement trompeur, et c'est ce que je voulais clarifier dans cette question.
4 votes
@Vilx : J'ai ajouté plus d'informations pour expliquer pourquoi
bcrypt
est un algorithme de hachage à sens unique par rapport à un schéma de cryptage dans ma réponse . Il y a cette idée fausse quebcrypt
est juste Blowfish alors qu'en fait, il a un programme de clé totalement différent qui garantit que le texte en clair ne peut pas être récupéré à partir du texte chiffré sans connaître l'état initial du chiffrement (sel, tours, clé).0 votes
Comment utiliser les fonctions de hachage de mot de passe de PHP 5.5
1 votes
Voir également la page de l'Openwall Cadre portable de hachage de mots de passe en PHP (PHPass). Il est renforcé contre un certain nombre d'attaques courantes sur les mots de passe des utilisateurs.