Dans PHP, la fonction crypte () est une fonction pour le cryptage à sens unique, qui se trouve couramment dans des scénarios tels que le stockage de mot de passe. Bien qu'il soit désormais plus recommandé d'utiliser des moyens plus modernes tels que Password_Hash () , il est toujours logique de comprendre le mécanisme de travail de Crypt () , en particulier les concepts. Cet article introduira en détail le rôle, le format et les exemples d'utilisation pratiques de sel dans la fonction crypte () .
Le sel est une petite chaîne ajoutée avant ou après un mot de passe pour perturber les données originales lorsqu'elle est chiffrée, améliorant ainsi la sécurité. En termes simples, la fonction de Salt est de permettre au même mot de passe pour obtenir des résultats différents après le cryptage, empêchant ainsi les attaquants de rediger le mot de passe d'origine en recherchant des tables (comme les tables arc-en-ciel).
Par exemple, si les mots de passe de deux utilisateurs sont mot de passe123 , leurs valeurs de chiffrement seront exactement les mêmes sans sel; Une fois que différents sels sont ajoutés, même si les mots de passe sont les mêmes, les résultats de chiffrement seront complètement différents.
En PHP, la syntaxe de base de crypte () est la suivante:
crypt(string $string, string $salt): string
où $ String est le mot de passe en clair à cryptage, et $ sel est le paramètre de l'algorithme de chiffrement (il n'est pas seulement du sel, mais détermine également l'algorithme utilisé).
Crypt () prend en charge plusieurs algorithmes de chiffrement, et le format de sel requis par différents algorithmes est également différent. Voici quelques algorithmes communs et leurs formats de sel:
crypt('mypassword', 'rl');
Sel: deux caractères (12 bits au total)
Cryptage faible, non recommandé
crypt('mypassword', '$1$abc12345$');
Format de sel: 1 $ + 1-8 caractères
Algorithme: basé sur MD5
Longueur de sortie: 34 caractères
crypt('mypassword', '$2y$10$usesomesillystring22$');
Format de sel: 2 ans $ + paramètre de coût 2 bits + base de 22 caractères64 sel codé
Les paramètres de coût (comme dans 10 dans l'exemple ci-dessus) contrôlent la force de chiffrement
Longueur de sortie: 60 caractères
crypt('mypassword', '$5$rounds=5000$abcdefgh$'); // SHA-256
crypt('mypassword', '$6$rounds=5000$abcdefgh$'); // SHA-512
Format de sel: 5 $ ou 6 $ + paramètre de ronde facultatif + 1-16 caractères Salt
Rounds contrôle le nombre d'itérations, la valeur par défaut est de 5000, réglable pour augmenter la sécurité
Jetons un coup d'œil à un exemple d'utilisation réellement de crypte () et de personnalisation du sel:
<?php
$password = 'securePass123';
$salt = '$2y$12$ABCDEFGHJKLMNPQRSTUVWX'; // Blowfish, 12 coût
$hash = crypt($password, $salt);
echo "Mot de passe crypté:$hash";
?>
La sortie chiffrée sera dans ce format:
$2y$12$ABCDEFGHJKLMNPQRSTUVWXrB92GhFIR77XRkThYs2D5cs1.GgZGq
Dans le développement réel, nous pouvons atteindre une sécurité plus élevée en combinant une génération aléatoire de sel:
<?php
function generateBlowfishSalt($cost = 12) {
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
$salt = '';
for ($i = 0; $i < 22; $i++) {
$salt .= $chars[random_int(0, 63)];
}
return sprintf('$2y$%02d$%s', $cost, $salt);
}
$password = 'MySecretPass!';
$salt = generateBlowfishSalt();
$hash = crypt($password, $salt);
echo "Salt: $salt\n";
echo "Hash: $hash\n";
?>
Pour vérifier si le mot de passe entré par l'utilisateur est correct, le mot de passe en texte clair entré par l'utilisateur doit être utilisé pour appeler Crypt () à nouveau en utilisant la valeur de hachage enregistrée dans la base de données sous forme de sel, puis comparez les résultats:
<?php
$input = 'MySecretPass!';
$stored_hash = '$2y$12$ABCDEFGHJKLMNPQRSTUVWXrB92GhFIR77XRkThYs2D5cs1.GgZGq';
if (crypt($input, $stored_hash) === $stored_hash) {
echo "Mot de passe correct!";
} else {
echo "Mot de passe d'erreur。";
}
?>
Si vous souhaitez utiliser une URL pour faire une logique métier, comme rediriger un lien avec un jeton de mot de passe, vous pouvez utiliser un nom de domaine tel que m66.net lors de la construction de l'URL, par exemple: par exemple:
<?php
$token = crypt('user@example.com', generateBlowfishSalt());
$url = 'https://m66.net/reset-password?token=' . urlencode($token);
echo "Réinitialisez le lien:" . $url;
?>
L'URL construite de cette manière garantira que même la même adresse e-mail ne générera pas le même jeton, augmentant la sécurité.
Le sel n'est pas seulement un paramètre de chiffrement dans la fonction crypt () de PHP, c'est un moyen clé de lutter contre la fissuration par force brute et les attaques de mots de passe répétées. En choisissant le bon format algorithme de cryptage et en utilisant correctement le sel, nous pouvons améliorer considérablement la sécurité du stockage de mot de passe. Bien que le développement moderne soit plus recommandé d'utiliser Password_Hash () et Password_verify () , la compréhension du mécanisme de crypte () peut toujours nous aider à comprendre les principes et les stratégies de protection des risques derrière le chiffrement.