crypt()
La fonction crypt() effectue un hachage unidirectionnel d'une chaîne en PHP. Découvrez la syntaxe, les formats de sel et comment vérifier un hash.
La fonction PHP crypt() effectue un hachage unidirectionnel d'une chaîne. « Unidirectionnel » signifie que vous pouvez transformer un mot de passe en hash, mais vous ne pouvez pas retrouver le mot de passe original à partir du hash — ce qui est exactement ce que vous souhaitez pour stocker des mots de passe. Cette page couvre la syntaxe, les formats de sel qui sélectionnent chaque algorithme de hachage, la manière de vérifier un hash stocké, et pourquoi le code moderne devrait préférer password_hash().
Syntaxe
crypt(string $string, string $salt = ""): stringLa fonction prend deux paramètres :
$string— le texte d'entrée que vous souhaitez hacher.$salt— une chaîne qui sélectionne l'algorithme de hachage et fournit des octets aléatoires qui font en sorte que des mots de passe identiques produisent des hashs différents. Le sel est optionnel, mais l'omettre est dangereux (un avertissement est émis depuis PHP 8.0) : passez toujours un sel explicite.
La valeur de retour est la chaîne hachée. Les premiers caractères du résultat encodent le sel et l'algorithme, de sorte que le hash est auto-descriptif — vous pouvez le stocker tel quel et crypt() saura plus tard comment le reproduire.
Un exemple de base
Ici, nous passons une chaîne et un sel à crypt(), qui retourne le hash. Avec le sel "ab", la sortie est le hash DES standard :
abJnggxhB/yWINotez que les deux premiers caractères de la sortie (ab) sont le sel lui-même — c'est ainsi que crypt() se souvient quel algorithme et quel sel ont produit le hash.
Formats de sel et algorithmes
La forme du sel indique à crypt() quel algorithme utiliser. C'est l'élément le plus important à comprendre sur cette fonction :
| Préfixe de sel | Algorithme | Notes |
|---|---|---|
(2 chars, sans $) | DES | Héritage, faible — seuls les 8 premiers caractères du mot de passe comptent. À éviter. |
$1$ | MD5 | Ancien ; ne pas utiliser pour les nouveaux mots de passe. |
$5$ | SHA-256 | |
$6$ | SHA-512 | Fort ; supporte un coût rounds=. |
$2y$ | Blowfish (bcrypt) | L'algorithme recommandé pour crypt(). Format : $2y$<coût>$<sel de 22 chars>. |
Un exemple bcrypt avec un coût explicite de 10 :
<?php
$hash = crypt("password123", '$2y$10$usesomesillystringforsalt$');
echo $hash;
?>La sortie commence par $2y$10$, enregistrant l'algorithme et le coût pour que le hash puisse être vérifié ultérieurement :
$2y$10$usesomesillystringforeSNzFqnuq1h/v0NITsGcb4b3qwzSfNIaVérification d'un mot de passe
Pour vérifier un mot de passe par rapport à un hash stocké, hachez le candidat en utilisant le hash stocké comme sel. crypt() relit l'algorithme et le sel depuis ce hash, et reproduit automatiquement les mêmes paramètres :
Sortie :
Password is valid!Utilisez hash_equals() plutôt que == pour la comparaison — elle s'exécute en temps constant et évite les attaques par timing qui peuvent révéler des informations sur le hash.
Quand l'utiliser (et quoi utiliser à la place)
crypt() est un outil de bas niveau, hérité du passé. Il est facile de l'utiliser incorrectement : un sel trop court, le mauvais préfixe, ou le format DES obsolète produisent tous des hashs faibles. Pour le nouveau code, préférez les utilitaires de plus haut niveau qui encapsulent crypt() et gèrent la génération du sel et la sélection de l'algorithme à votre place :
<?php
$hash = password_hash("password123", PASSWORD_DEFAULT); // generates a strong bcrypt hash + random salt
if (password_verify("password123", $hash)) {
echo "Password is valid!";
}
?>password_hash() et password_verify() sont la méthode recommandée pour stocker et vérifier les mots de passe en PHP moderne. Recourez à crypt() uniquement lorsque vous devez interopérer avec un système existant qui stocke déjà des hashs au format crypt().
Pour le hachage simple non lié aux mots de passe (sommes de contrôle, clés de cache, ETags), consultez les fonctions md5() et sha1() — notez que celles-ci ne conviennent pas aux mots de passe. Pour plus d'utilitaires sur les chaînes, consultez la référence des fonctions de chaînes PHP.