OVH Cloud OVH Cloud

Cryptage MD5 ??

5 réponses
Avatar
carra_bea
Bonjour,

plusieurs logiciels utilisent le cryptage MD5 pour les mots de passe.
Quelqu'un pourrait-il m'expliquer en quoi cela consiste.
MD5 est une fonction de hachage pas de chiffrement, je ne comprends
pas ...
Merci d'avance.

5 réponses

Avatar
pornin
According to betty :
plusieurs logiciels utilisent le cryptage MD5 pour les mots de passe.
Quelqu'un pourrait-il m'expliquer en quoi cela consiste.


Le terme de "cryptage" n'est non seulement pas français, mais en plus
il est ici utilisé abusivement.

Le modèle de base est que l'utilisateur connaît un mot de passe et veut
s'en servir pour s'authentifier auprès d'un serveur qui connaît aussi le
mot de passe. Ce modèle a un problème : le serveur doit stocker les mots
de passe quelque part (genre, sur un disque dur), et si un pirate arrive
à obtenir un accès en lecture à ce disque, il récupère tous les mots de
passe.

La correction est donc la suivante : le serveur ne stocke pas les mots
de passe eux-mêmes, mais un hachage (par MD5, par exemple) de ces mots
de passe. Ainsi, quand un utilisateur arrive et envoie le mot de passe
P, le serveur calcule MD5(P) et regarde si ça correspond à la valeur
stockée dans ses entrailles. Si le pirate accède en lecture au disque
dur du serveur, il ne voit que les MD5(P) et ne peut pas retrouver les
mots de passe.

En bref, le serveur ne stocke plus les mots de passe mais seulement un
moyen de vérifier un mot de passe qu'on lui fournit par ailleurs. MD5
est une fonction de hachage, pas de chiffrement, donc le serveur ne
peut pas retrouver le mot de passe tout seul; mais il n'en a pas besoin
(il ne cherche pas à retrouver le mot de passe, juste à vérifier que le
mot de passe que l'utilisateur fournit est le bon) et même c'est tout
l'intérêt de MD5. On ne veut _pas_ que le serveur ait les moyens de
retrouver les mots de passe tout seul, parce que s'il peut le faire,
alors un pirate faisant une copie du disque dur peut le faire aussi.


Conceptuellement, les attaques par un pirate ayant un accès en lecture
sont bloquées ; le méchant doit pouvoir _écrire_ sur le disque dur pour
contourner le système. Dans la pratique, on veut quand même garder les
MD5 des mots de passe secrets, à cause des attaques par dictionnaire ;
MD5 est ici plus un système pour limiter les dégâts en cas d'attaque
qu'un système de protection absolue.


Note : les systèmes Unix, avant de se mettre à MD5, utilis(ai)ent une
autre fonction dérivée de DES, qui est un système de chiffrement. Mais
c'était un DES modifié et utilisé de façon détournée, qui au final
faisait le travail d'une fonction de hachage (le mot de passe était
utilisé comme clé, pas comme données).


--Thomas Pornin

Avatar
Franck Arnulfo
Thomas Pornin wrote:

According to betty :

plusieurs logiciels utilisent le cryptage MD5 pour les mots de passe.
Quelqu'un pourrait-il m'expliquer en quoi cela consiste.



Le terme de "cryptage" n'est non seulement pas français, mais en plus
il est ici utilisé abusivement.

Le modèle de base est que l'utilisateur connaît un mot de passe et veut
s'en servir pour s'authentifier auprès d'un serveur qui connaît aussi le
mot de passe. Ce modèle a un problème : le serveur doit stocker les mots
de passe quelque part (genre, sur un disque dur), et si un pirate arrive
à obtenir un accès en lecture à ce disque, il récupère tous les mots de
passe.

La correction est donc la suivante : le serveur ne stocke pas les mots
de passe eux-mêmes, mais un hachage (par MD5, par exemple) de ces mots
de passe. Ainsi, quand un utilisateur arrive et envoie le mot de passe
P, le serveur calcule MD5(P) et regarde si ça correspond à la valeur
stockée dans ses entrailles. Si le pirate accède en lecture au disque
dur du serveur, il ne voit que les MD5(P) et ne peut pas retrouver les
mots de passe.

En bref, le serveur ne stocke plus les mots de passe mais seulement un
moyen de vérifier un mot de passe qu'on lui fournit par ailleurs. MD5
est une fonction de hachage, pas de chiffrement, donc le serveur ne
peut pas retrouver le mot de passe tout seul; mais il n'en a pas besoin
(il ne cherche pas à retrouver le mot de passe, juste à vérifier que le
mot de passe que l'utilisateur fournit est le bon) et même c'est tout
l'intérêt de MD5. On ne veut _pas_ que le serveur ait les moyens de
retrouver les mots de passe tout seul, parce que s'il peut le faire,
alors un pirate faisant une copie du disque dur peut le faire aussi.


Conceptuellement, les attaques par un pirate ayant un accès en lecture
sont bloquées ; le méchant doit pouvoir _écrire_ sur le disque dur pour
contourner le système. Dans la pratique, on veut quand même garder les
MD5 des mots de passe secrets, à cause des attaques par dictionnaire ;
MD5 est ici plus un système pour limiter les dégâts en cas d'attaque
qu'un système de protection absolue.


Note : les systèmes Unix, avant de se mettre à MD5, utilis(ai)ent une
autre fonction dérivée de DES, qui est un système de chiffrement. Mais
c'était un DES modifié et utilisé de façon détournée, qui au final
faisait le travail d'une fonction de hachage (le mot de passe était
utilisé comme clé, pas comme données).


--Thomas Pornin


Je n'ai pas posé la question mais merci de la clarté de la réponse.

J'aurai cependant une question supplémentaire, j'ai lu qq part qu'en
plus du mot de passe en clair on pouvait ajoutait un paramètre variant
(seed/graine) avant de le passer à MD5 ceci pour rendre plus difficile
les attaques par force brute qui tenterait de générer une liste de hash
MD5 à partir d'un dictionnaire (cf. une news de slashdot ou un site web
fournit une telle liste pour des mots de qq caractères). Par contre vu
que le serveur doit retrouver ce paramètre lors de la présentation du
mot de passe, il doit le sauvegarder qq part et donc pouvoir être *lu*.
Quels systèmes utilisent cela et quel paramètre variant utilisent-ils ?

Merci

Franck Arnulfo


Avatar
Clement Seveillac
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Franck Arnulfo wrote:
J'aurai cependant une question supplémentaire, j'ai lu qq part qu'en
plus du mot de passe en clair on pouvait ajoutait un paramètre
variant (seed/graine) avant de le passer à MD5 ceci pour rendre plus
difficile les attaques par force brute qui tenterait de générer une
liste de hash MD5 à partir d'un dictionnaire (cf. une news de
slashdot ou un site web fournit une telle liste pour des mots de qq
caractères). Par contre vu que le serveur doit retrouver ce paramètre
lors de la présentation du mot de passe, il doit le sauvegarder qq
part et donc pouvoir être *lu*.


C'est tout a fait vrai.

Quels systèmes utilisent cela et quel paramètre variant
utilisent-ils?


Le plus courant est le /etc/shadow des Unix, Linux et *BSD recents. On y
trouve le hash MD5 des mots de passes des utilisateurs *et* d'une graine
aleatoire, calcules bien sur a chaque renouvellement de mot de passe.

Par exemple, avec le mot de passe 'toto':

% echo "toto" |mkpasswd --hash=MD5 --stdin
$1$iUZnYnfA$22/u/kb1Cq.XxTPSCK7Oz0

La graine (aleatoire, calculee grace a /dev/random) est donnee entre le
deuxieme et le troisieme '$', le hash MD5 du mot de passe et de la
graine est donne apres le troisieme '$', et toute la ligne va dans le
deuxieme champ du /etc/shadow, derriere le login.

Quand on veut verifier un mot de passe, on calcule simplement son hash
avec la graine donnee :

% echo "toto" |mkpasswd --salt=iUZnYnfA --hash=MD5 --stdin
$1$iUZnYnfA$22/u/kb1Cq.XxTPSCK7Oz0

Et on retrouve le meme mot de passe si tout va bien :-)

Cordialement,
- --
clem
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)
Comment: Secure Email! http://dudu.dyn.2-h.org/gpg-enigmail-howto

iQEVAwUBQQujepC029jjKP/wAQJOGQgAjF9WQZv8Jpq6gQIm68NNGlZjCyucHHC/
c/LsCZo1MgKALwE87kSfLpmes1lTUG9bEF+bYZQVuHKNjYDi4B2iNcuHK0Nld+Rx
FskJRyovEPvMleHFIDrInuHdnxYoIILLrXWaS87Y2e/Ua6ffTFFuSSyfYTmsZqT6
4kyjqSL+Q2yzm/3p9GEIgMS6C8mAX54ZeFQsjSUO5+SOcDM0qB8NimApgqJnwhhf
2SxDu8hm+pBvrKVZPNto2REsAGg+iAIwmjITDdqF/ZEH4pvvkbHLGnfW/RfjUNY9
9oN+JItLtRQG01WVuhkDZ5f+cY7kTHRQcFKXjoM3K0FMHxxyQM4ZrQ= Ê4T
-----END PGP SIGNATURE-----

Avatar
Franck Arnulfo
Clement Seveillac wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Franck Arnulfo wrote:

J'aurai cependant une question supplémentaire, j'ai lu qq part qu'en
plus du mot de passe en clair on pouvait ajoutait un paramètre
variant (seed/graine) avant de le passer à MD5 ceci pour rendre plus
difficile les attaques par force brute qui tenterait de générer une
liste de hash MD5 à partir d'un dictionnaire (cf. une news de
slashdot ou un site web fournit une telle liste pour des mots de qq
caractères). Par contre vu que le serveur doit retrouver ce paramètre
lors de la présentation du mot de passe, il doit le sauvegarder qq
part et donc pouvoir être *lu*.



C'est tout a fait vrai.


Quels systèmes utilisent cela et quel paramètre variant
utilisent-ils?



Le plus courant est le /etc/shadow des Unix, Linux et *BSD recents. On y
trouve le hash MD5 des mots de passes des utilisateurs *et* d'une graine
aleatoire, calcules bien sur a chaque renouvellement de mot de passe.

Par exemple, avec le mot de passe 'toto':

% echo "toto" |mkpasswd --hash=MD5 --stdin
$1$iUZnYnfA$22/u/kb1Cq.XxTPSCK7Oz0

La graine (aleatoire, calculee grace a /dev/random) est donnee entre le
deuxieme et le troisieme '$', le hash MD5 du mot de passe et de la
graine est donne apres le troisieme '$', et toute la ligne va dans le
deuxieme champ du /etc/shadow, derriere le login.

Quand on veut verifier un mot de passe, on calcule simplement son hash
avec la graine donnee :

% echo "toto" |mkpasswd --salt=iUZnYnfA --hash=MD5 --stdin
$1$iUZnYnfA$22/u/kb1Cq.XxTPSCK7Oz0

Et on retrouve le meme mot de passe si tout va bien :-)

Cordialement,
- --
clem


Merci pour l'info

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)
Comment: Secure Email! http://dudu.dyn.2-h.org/gpg-enigmail-howto

iQEVAwUBQQujepC029jjKP/wAQJOGQgAjF9WQZv8Jpq6gQIm68NNGlZjCyucHHC/
c/LsCZo1MgKALwE87kSfLpmes1lTUG9bEF+bYZQVuHKNjYDi4B2iNcuHK0Nld+Rx
FskJRyovEPvMleHFIDrInuHdnxYoIILLrXWaS87Y2e/Ua6ffTFFuSSyfYTmsZqT6
4kyjqSL+Q2yzm/3p9GEIgMS6C8mAX54ZeFQsjSUO5+SOcDM0qB8NimApgqJnwhhf
2SxDu8hm+pBvrKVZPNto2REsAGg+iAIwmjITDdqF/ZEH4pvvkbHLGnfW/RfjUNY9
9oN+JItLtRQG01WVuhkDZ5f+cY7kTHRQcFKXjoM3K0FMHxxyQM4ZrQ= > Ê4T
-----END PGP SIGNATURE-----



Avatar
carra_bea
Merci à tous pour ces explications on ne peut plus claire !