Position actuelle: Accueil> Derniers articles> Description du rôle et du format de sel dans crypte ()

Description du rôle et du format de sel dans crypte ()

M66 2025-05-20

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 () .

Qu'est-ce que le sel?

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.

Le mécanisme de travail de crypte ()

En PHP, la syntaxe de base de crypte () est la suivante:

 crypt(string $string, string $salt): string

$ 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é).

Description du format de Salt

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:

1. DES (par défaut, obsolète)

 crypt('mypassword', 'rl');
  • Sel: deux caractères (12 bits au total)

  • Cryptage faible, non recommandé

2. MD5 (en utilisant une marque de 1 $ )

 crypt('mypassword', '$1$abc12345$');
  • Format de sel: 1 $ + 1-8 caractères

  • Algorithme: basé sur MD5

  • Longueur de sortie: 34 caractères

3. Blowfish (en utilisant 2A $ , 2 $ $ ou 2 milliards de dollars de drapeaux))

 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

4. SHA-256 / SHA-512 (en utilisant 5 $ / 6 $ de marque)

 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é

Exemples pratiques

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";
?>

La bonne façon de vérifier votre mot de passe

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&#39;erreur。";
}
?>

Scénarios d'application utilisant m66.net comme exemple de nom de domaine

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é.

Résumer

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.