Lorsque vous utilisez la fonction Crypt () de PHP pour le hachage du mot de passe, la sécurité du sel affecte directement la sécurité du stockage de mot de passe. La fonction de la valeur de sel est d'empêcher le même mot de passe de générer la même valeur de hachage, résistant ainsi efficacement aux attaques de table arc-en-ciel. Par conséquent, il est très important de générer une valeur de sel sûre et fiable.
La valeur de sel est une chaîne aléatoire qui est ajoutée au mot de passe puis hachée. Une bonne valeur de sel nécessite les caractéristiques suivantes:
Unique et aléatoire: chaque mot de passe correspond à une valeur de sel unique.
Assez longtemps: évitez la valeur de sel facilement devinée.
Convient aux algorithmes de hachage: différents algorithmes ont des exigences pour la longueur et le format de la valeur de sel.
Crypt () prend en charge plusieurs algorithmes de chiffrement, et différents algorithmes ont des exigences différentes pour les formats de valeur de sel. Les algorithmes communs et les formats de valeur de sel sont les suivants:
DES : La valeur de sel mesure 2 caractères.
MD5 : Commencez par 1 $ , avec un maximum de 8 caractères en valeur de sel, tels que 1 $ ABCDEFGH $ .
Blowfish : Commencez par 2A $ ou 2 $ $ , suivi d'un facteur de coût à deux chiffres et d'une valeur de sel de 22 caractères, tels que 2 ans 10 $ ABCDEFGHIJKLMNOPQRSTUV .
SHA-256 : Commencez avec 5 $ , suivi de la valeur de sel, jusqu'à 16 caractères.
SHA-512 : Commencez par 6 $ , suivi d'une valeur de sel, jusqu'à 16 caractères.
Les algorithmes de Blowfish ( 2 ans $ ) ou SHA-512 ( 6 $ ) sont recommandés car ils sont plus sûrs et soutiennent des valeurs de sel plus longues.
La clé pour générer des valeurs de sel est d'utiliser des fonctions de génération de nombres aléatoires sûres et de se conformer aux exigences de format de valeur de sel de l'algorithme correspondant.
Exemple de code:
<?php
function generateSalt($algo = 'bcrypt') {
switch ($algo) {
case 'bcrypt':
// Blowfish besoin 22 autonome Base64 personnage,Le coût est 10
$cost = 10;
// En utilisant des octets aléatoires,转换成可用的personnage集
$randomBytes = random_bytes(16);
$base64String = substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 22);
return sprintf('$2y$%02d$%s', $cost, $base64String);
case 'sha512':
// SHA-512 Maximum autorisé16personnage盐
$randomBytes = random_bytes(12);
return '$6$' . substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 16);
default:
throw new Exception("Unsupported algorithm");
}
}
// Exemple d'utilisation
$password = 'user_password';
$salt = generateSalt('bcrypt');
$hash = crypt($password, $salt);
echo "Valeur de sel:$salt\n";
echo "Valeur de hachage:$hash\n";
?>
Dans le code ci-dessus:
Random_Bytes () est utilisé pour générer des octets aléatoires sûrs.
Base64_Encode () est codé et remplacé par + pour répondre aux exigences du format de valeur de sel.
Blowfish utilise le facteur de coût 10, qui est à la fois sûr et raisonnable dans les performances.
La valeur de sel générée est strictement dans le format requis par Crypt () .
PHP 7.2 et plus recommandent fortement d'utiliser la fonction intégrée Password_Hash () , qui gère automatiquement la génération de valeur de sel et la sélection des algorithmes, simplifiée et plus sûre:
<?php
$password = 'user_password';
$hash = password_hash($password, PASSWORD_BCRYPT);
echo $hash;
?>
Si vous devez utiliser Crypt () manuellement, assurez-vous de vous assurer que la valeur de sel est sûre et aléatoire et que le format est correct, sinon cela entraînera facilement un affaiblissement du hachage.