Dans PHP, la fonction crypte () est une méthode traditionnelle pour chiffrer les mots de passe. Il prend en charge plusieurs algorithmes de chiffrement et permet des mécanismes de chiffrement spécifiques en transmettant des valeurs de sel dans différents formats. Bien que des API de hachage de mot de passe plus modernes (telles que Password_Hash () ) aient été recommandées ces dernières années, Crypt () est toujours largement utilisé dans certains anciens systèmes. Par conséquent, comprendre comment choisir l'algorithme approprié et le format de valeur de sel pour la fonction crypte () est la clé pour assurer la sécurité et la compatibilité du système.
La fonction crypt () utilise l'algorithme utilisé pour identifier le préfixe de valeur de sel. Voici les algorithmes traditionnels et leurs formats de valeur de sel correspondants:
DES (algorithme traditionnel)
Format de valeur de sel: 2 caractères (par exemple: "xy")
Sécurité: très bas, plus recommandé.
Md5
Format de valeur de sel: 1 $ + jusqu'à 8 caractères (par exemple: 1 $ ABC12345 )
Sécurité: faible, facile d'être brutal.
Flowfish
Format de la valeur de sel: 2y $ + 2 bits Facteur de coût + codage de base64 de base de 22 bits (par exemple: 2y $ 10 $ ABCDEFGHIJKLMNOPQRSTUU )
Sécurité: haut, largement utilisé.
Compatibilité: il est recommandé d'utiliser 2 ans $ au lieu de 2A $ car 2 $ $ corrige les problèmes de sécurité historiques.
SHA-256 et SHA-512 (GLIBC)
Format de valeur de sel:
SHA-256: 5 $ + paramètre de tours facultatifs + sel (par exemple: 5 $ Rounds = 5000 $ mysaltvalue )
SHA-512: 6 $ + paramètre de tours facultatifs + sel (par exemple: 6 $ MySaltValue )
Sécurité: élevé
Compatibilité: Disponible sur les plates-formes prises en charge par GLIBC (comme la plupart des systèmes Linux), mais pas Windows.
Lors du choix d'un algorithme de chiffrement, les points suivants doivent être pris en compte:
Exigences de sécurité : Si le système doit résister à la fissuration par force brute du matériel moderne, il est recommandé d'utiliser Blowfish ( 2 $ $ ) ou SHA-512 ( 6 $ ).
Compatibilité multiplateforme : si le système doit être migré entre Linux et Windows, l'algorithme Blowfish doit être utilisé en premier, car la variante SHA est incompatible sur les fenêtres.
Contrôle des coûts de calcul : Blowfish prend en charge les paramètres de coût (2–31) et peut être ajusté en fonction des performances du serveur. Par exemple, 2 ans 12 $ $ signifie 2 ^ 12 itérations.
La valeur de sel est utilisée pour empêcher le même mot de passe de produire le même hachage, de sorte que les caractéristiques suivantes doivent être:
Unicité : le mot de passe de chaque utilisateur doit utiliser un sel différent.
Imprévisibilité : le sel doit être généré à l'aide d'une source pseudo-aléatoire sûre.
Exemple de code, en utilisant Blowfish pour générer un hachage avec du sel:
function generateSalt($cost = 10) {
$salt = substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
return sprintf('$2y$%02d$%s$', $cost, $salt);
}
$password = 'MySecurePassword123';
$salt = generateSalt(12);
$hash = crypt($password, $salt);
echo "Le mot de passe crypté est: " . $hash;
Lorsque vous utilisez Crypt () pour la vérification du mot de passe, l'entrée de l'utilisateur doit être transmise à Crypt () ainsi que le hachage d'origine, tel que:
function verifyPassword($password, $hash) {
return crypt($password, $hash) === $hash;
}
Cela garantit que le processus de vérification utilise le même algorithme et les mêmes valeurs de sel.
Ne spécifiez pas manuellement les chaînes avec des valeurs de sel inconnues , utilisez les valeurs de sel sûres générées automatiquement par le programme.
Évitez d'utiliser DES ou MD5 même s'ils sont toujours pris en charge.
Migration préférentielle vers Password_Hash () et Password_verify () , ces fonctions sont maintenues par PHP et gérent automatiquement les algorithmes et les valeurs de sel, qui peuvent mieux résister aux attaques modernes.
Un ancien système enregistre le mot de passe lorsqu'un utilisateur enregistre:
$password = $_POST['password'];
$salt = generateSalt(12);
$hashed = crypt($password, $salt);
// garder $hashed Aller à la base de données
Vérifiez le mot de passe lors de la connexion:
$input = $_POST['password'];
$stored_hash = getPasswordFromDatabase(); // Supposons qu'il a été récupéré de la base de données
if (verifyPassword($input, $stored_hash)) {
echo "Connectez-vous avec succès";
} else {
echo "Mot de passe d'erreur";
}
Bien que la fonction crypte () ne soit plus l'outil préféré en PHP moderne, il est toujours important de comprendre ses algorithmes et ses mécanismes de valeur de sel, en particulier lors de la maintenance des anciens systèmes. Il est recommandé d'utiliser l'algorithme Blowfish ( 2 ans $ ) avec des valeurs de sel générées en toute sécurité pour assurer un équilibre entre la compatibilité et la sécurité. Il est également recommandé de transformer le système vers Password_Hash () à long terme, une solution plus moderne et sécurisée.