Dans PHP, la fonction Crypt est une fonction classique pour le hachage du mot de passe. Il prend en charge une variété d'algorithmes de chiffrement, tels que DES, MD5, Blowfish, SHA-256 et SHA-512. L'utilisation d'un sel approprié améliore non seulement la sécurité du mot de passe, mais contrôle également la complexité des algorithmes de chiffrement et du hachage.
Cet article expliquera en détail comment générer dynamiquement des modèles de sel pour plusieurs algorithmes, afin que vous puissiez spécifier de manière flexible les algorithmes et les valeurs de sel lors de l'utilisation de fonctions cryptantes .
$password = 'mypassword';
$salt = '$6$rounds=5000$usesomesillystring$'; // SHA-512 Exemple de sel
$hash = crypt($password, $salt);
echo $hash;
Dans l'exemple ci-dessus, 6 $ signifie que l'utilisation de l'algorithme SHA-512, Rounds = 5000 représente le nombre d'itérations de chiffrement, et la chaîne suivante est le corps de valeur de sel.
algorithme | Préfixe de sel | Longueur et description du sel |
---|---|---|
Des | Pas de préfixe | Sel à 2 caractères |
Md5 | 1 $ | Sel à 8 caractères |
Flowfish | 2a $ $ ou 2 $ $ | Sel de 22 caractères (y compris les paramètres de version et de coût) |
SHA-256 | 5 $ | Rounds de paramètres facultatifs, corps de sel jusqu'à 16 caractères |
SHA-512 | 6 $ | Rounds de paramètres facultatifs, corps de sel jusqu'à 16 caractères |
Après les comprendre, nous pouvons générer dynamiquement des modèles de sel appropriés en fonction de différents algorithmes.
Voici un exemple de fonction PHP qui peut générer un modèle de sel dans le format correspondant en fonction du nom de l'algorithme d'entrée:
function generateSalt($algorithm = 'sha512', $rounds = 5000) {
// Fonction de génération de corps au sel aléatoire,La longueur est ajustée en fonction des limitations de l'algorithme
function randomSalt($length) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./';
$salt = '';
for ($i = 0; $i < $length; $i++) {
$salt .= $chars[random_int(0, strlen($chars) - 1)];
}
return $salt;
}
switch (strtolower($algorithm)) {
case 'des':
// DES Seulement avant le sel2personnage
return substr(randomSalt(2), 0, 2);
case 'md5':
// MD5 Format de sel $1$salt$
return '$1$' . randomSalt(8) . '$';
case 'blowfish':
// Blowfish Format $2y$cost$22charsalt
$cost = 10; // 2chiffres,Il est recommandé d'être04arriver31entre
$costStr = str_pad($cost, 2, '0', STR_PAD_LEFT);
return '$2y$' . $costStr . '$' . randomSalt(22);
case 'sha256':
// SHA-256 Format $5$rounds=xxxx$salt$
return '$5$rounds=' . intval($rounds) . '$' . randomSalt(16) . '$';
case 'sha512':
default:
// SHA-512 Format $6$rounds=xxxx$salt$
return '$6$rounds=' . intval($rounds) . '$' . randomSalt(16) . '$';
}
}
$password = 'my_secret_password';
// Algorithme de sélection
$algorithm = 'blowfish';
// Générer des modèles de sel correspondants
$salt = generateSalt($algorithm);
// Générer du hachage
$hash = crypt($password, $salt);
echo "algorithme: {$algorithm}\n";
echo "Modèle de sel: {$salt}\n";
echo "Générer du hachage: {$hash}\n";
De cette façon, vous pouvez avoir un contrôle très flexible des algorithmes et des paramètres de sel utilisés lors du chiffrement des mots de passe, améliorant la sécurité.
À l'aide d'un schéma de hachage de mot de passe plus sécurisé, il est recommandé de considérer les fonctions de Password_hash et de mot de passe_vriefy de PHP, qui résument la complexité sous-jacente, utilisent des algorithmes forts par défaut et gérer automatiquement le sel.
Essayez d'éviter les paramètres d'épissage manuellement dans les chaînes de sel, et il est recommandé d'utiliser des fonctions de génération de nombres aléatoires fiables telles que Random_int .
Ajustez régulièrement les rondes (nombre d'itérations) selon la sécurité des besoins pour améliorer la capacité de résister à la fissuration par force brute.