Dans le développement d'applications Web moderne, le stockage sécurisé des mots de passe utilisateur est crucial. La fonction Crypt () intégrée de PHP prend en charge une variété d'algorithmes de chiffrement, y compris l'algorithme de cryptage Blowfish. L'algorithme Blowfish est largement utilisé dans le hachage de mot de passe pour ses facteurs de travail à haute intensité et personnalisables (coût). Cet article présentera en détail comment utiliser la fonction Crypt () de PHP pour chiffrer les mots de passe en toute sécurité à l'aide de l'algorithme Blowfish (identifiant $ $ $ $ ).
Blowfish est un algorithme de chiffrement à clé symétrique conçu spécifiquement pour remplacer les anciens algorithmes de cryptage. Pour le hachage de mot de passe, Blowfish offre de bonnes capacités de fissuration à l'épreuve de la brute avec son "facteur de travail" réglable. Plus le facteur de travail est élevé, plus il faut longtemps pour calculer le chiffrement, améliorant ainsi la sécurité des mots de passe.
La fonction Crypt () de PHP utilise l'identifiant de 2 $ $ pour représenter le format de hachage Blowfish, qui est un format recommandé pour PHP 5.3.7 et supérieur, ce qui peut éviter les problèmes de sécurité dans les versions antérieures.
Le sel de l'algorithme Blowfish est une chaîne de 22 caractères contenant AZ , AZ , 0-9 , . , / Au total 64 caractères. Le format de sel requis par la crypte de PHP () est le suivant:
$2y$ + Deux facteurs de travail(cost) + $ + 22 sel
Par exemple:
$salt = '$2y$12$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
Ici, 12 est le facteur de travail, représentant 2 ^ 12 calculs de hachage, qui est environ 4096 fois, ce qui est à la fois sûr et pas trop lent.
$password = 'your_password_here';
$hash = crypt($password, $salt);
Le Hash $ retourné est une chaîne de hachage Blowfish complète qui peut être stockée directement dans la base de données.
Lors de la vérification du mot de passe, utilisez le hachage d'origine comme sel pour appeler crypte () et comparer les résultats:
function verify_password($password, $hash) {
return crypt($password, $hash) === $hash;
}
<?php
// Générer un sel sûr
function generate_blowfish_salt($cost = 12) {
if ($cost < 4 || $cost > 31) {
throw new InvalidArgumentException("Le facteur de travail doit être4arriver31entre");
}
$randomBytes = random_bytes(16);
$base64Salt = substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 22);
return sprintf('$2y$%02d$%s', $cost, $base64Salt);
}
// Mot de passe de chiffrement
function encrypt_password($password, $cost = 12) {
$salt = generate_blowfish_salt($cost);
return crypt($password, $salt);
}
// Vérifier le mot de passe
function verify_password($password, $hash) {
return crypt($password, $hash) === $hash;
}
// test
$password = 'mypassword123';
$hash = encrypt_password($password);
echo "Hachage de mot de passe: $hash\n";
if (verify_password('mypassword123', $hash)) {
echo "La vérification du mot de passe a réussi!\n";
} else {
echo "La vérification du mot de passe a échoué!\n";
}
?>
PHP Document officiel: https://www.m66.net/manual/zh/fonction.crypt.php