4 votes

Qu'est-ce qui est crypté lorsque j'utilise un CRYPT_MD5 salé pour crypter mon mot de passe ?

L'utilisation de md5 sur une chaîne de caractères produit toujours un résultat alphanumérique crypté, c'est-à-dire sans symboles.

Cependant, lorsque j'utilise la fonction php crypt(), en particulier la fonction CRYPT_MD5 (et elle est activée, j'ai vérifié) avec un sel, le supposé hachage md5 qu'elle renvoie ne ressemble pas à un hachage md5.

Par exemple :

si je md5 la chaîne 'password', j'obtiens :

$pass = md5('password');
echo $pass;
//5f4dcc3b5aa765d61d8327deb882cf99

si j'utilise CRYPT_MD5, qui est désigné par le préfixe "$1$" et le suffixe "$", le sel étant "salt" :

$pass = crypt('password', '$1$salt$');
echo $pass;
//$1$salt$qJH7.N4xYta3aEG/dfqo/0

Maintenant, l'algorithme et le sel utilisés sont affichés comme prévu, '$1$' indique que le CRYPT_MD5 a été utilisé et le sel est 'salt' entre les signes $.

Cependant, le mot de passe haché après le dernier signe $ ne ressemble pas à un md5... il contient des barres obliques et des points.

Pourquoi le hachage se fait-il de cette manière ? N'est-ce pas un vrai md5 ?

N'hésitez pas à me demander des précisions si vous le souhaitez. Ugh.

10voto

Douglas Leeder Points 29986
  1. MD5 est un algorithme de hachage et non de cryptage.
  2. Le résultat du MD5 est une donnée de 128 bits. Dans votre premier exemple, les 128 bits sont codés sous la forme de 32 chiffres hexadécimaux (4 bits par chiffre). Le deuxième exemple utilise l'alphabet cryptographique ./0-9A-Za-z - 21 caractères à 6 bits par caractère.

Pour plus de détails sur l'algorithme de cryptage, voir http://www.gnu.org/software/libtool/manual/libc/crypt.html

1voto

vy32 Points 6298

Vous avez raison, 5f4dcc3b5aa765d61d8327deb882cf99 est le MD5 de la chaîne "password". Il n'y a pas de sel ajouté, mais vous pouvez facilement en ajouter un en prenant MD5("password" . "$salt")

Cependant, la fonction PHP crypt() peut utiliser une variété de hachages différents pour calculer le hachage. Lorsque vous préfixez votre sel par "$1$", vous obtenez un hachage avec un MD5. Lorsque vous préfixez votre sel avec $2$, vous obtenez un cryptage avec blowfish, qui est plus sûr.

Le préfixe "$1$" est ajouté à la sortie afin que le hachage puisse être vérifié. S'il n'était pas inclus, il n'y aurait aucun moyen de savoir, à partir du hachage stocké, quel algorithme doit être utilisé ! Cette information devrait être stockée ailleurs. Pour vous éviter ce problème, PHP inclut l'algorithme dans le résultat du hachage.

Pour vérifier un hachage, on prend le mot de passe fourni par l'utilisateur comme mot de passe, et on prend tout ce qui va jusqu'au troisième signe de dollar comme sel, et on vérifie si les résultats obtenus correspondent à ceux qui sont stockés.

La partie suivante de votre confusion est que la fonction MD5() vous donne un hachage hexadécimal, alors que la fonction crypt() vous donne un hachage codé en Base64. C'est parce que Base64 est plus efficace.

C'est simple ?

0voto

gamers2000 Points 604

Il s'agit bien d'un hachage MD5, mais il n'est pas correctement formaté en tant que chaîne de caractères. Cela ne devrait pas poser de problème.

-1voto

Tim Points 1

Voilà ce que je pense - je ne suis pas sûr que ce soit correct. md5 calcule un hachage alors que crypt effectue un cryptage - bien qu'en utilisant une saveur md5. Les hachages sont à sens unique et donnent des résultats de longueur fixe pour une entrée de longueur arbitraire. Le cryptage est bidirectionnel et ne donne pas de résultats de longueur fixe.

Je pense que la rfc sur le hachage md5 définit probablement le résultat à utiliser [a-z], [A-Z], [0-9] alors que le cryptage n'a pas cette limitation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X