Md5 : Mais comment fait il ??? oO!
Fricky42
Messages postés
466
Date d'inscription
Statut
Membre
Dernière intervention
-
NHenry Messages postés 15219 Date d'inscription Statut Modérateur Dernière intervention -
NHenry Messages postés 15219 Date d'inscription Statut Modérateur Dernière intervention -
Stravudjivian*,
Voila. Cela fait un petit moment que j'utilise la fonction md5 de php. Evidemment, vu que je n'aime pas manipuler des machins completement obscure, j'ai fait des recherches pour voir un peu comment il fonctionne... Bon, j'ai rien bité, ca reste en partie obscure pour moi. Cependant une enigme me hante l'esprit jour et nuit O.O!
Comment, mais comment, avec toute la logique du monde, un programme peut traduire toute chaine de 0 a x>32 caracteres comprenant des caracteres speciaux, en une chaine toujours egale a 32 caracteres de A-Z,a-z,0-9 ??
On est tous d'accord quil existe beaucoup plus de possibilite de chaines qui vont de 0 a 60 (au moins) caracteres comprenant les A, a, @, 0, etc...qu'une chaine de toujours 32 caracteres comprenant que du A,a,0
C'est raisonnement tout beta, mais c'est logique...
Voila, si quelqu'un aurait la gentillesse de m'expliquer car c'est un genre de torture pour moi ce machin =D.
Mici et bonne journee !
*Bonjour en rien du tout.
Voila. Cela fait un petit moment que j'utilise la fonction md5 de php. Evidemment, vu que je n'aime pas manipuler des machins completement obscure, j'ai fait des recherches pour voir un peu comment il fonctionne... Bon, j'ai rien bité, ca reste en partie obscure pour moi. Cependant une enigme me hante l'esprit jour et nuit O.O!
Comment, mais comment, avec toute la logique du monde, un programme peut traduire toute chaine de 0 a x>32 caracteres comprenant des caracteres speciaux, en une chaine toujours egale a 32 caracteres de A-Z,a-z,0-9 ??
On est tous d'accord quil existe beaucoup plus de possibilite de chaines qui vont de 0 a 60 (au moins) caracteres comprenant les A, a, @, 0, etc...qu'une chaine de toujours 32 caracteres comprenant que du A,a,0
C'est raisonnement tout beta, mais c'est logique...
Voila, si quelqu'un aurait la gentillesse de m'expliquer car c'est un genre de torture pour moi ce machin =D.
Mici et bonne journee !
*Bonjour en rien du tout.
A voir également:
- Md5 : Mais comment fait il ??? oO!
- Md5 checksum - Télécharger - Web & Internet
- Md5 - Télécharger - Gestion de fichiers
- Ouvrir fichier md5 - Télécharger - Gestion de fichiers
- MST MD5 - Télécharger - Gestion de fichiers
- Comment décrypter du MD5 - Forum Programmation
12 réponses
Haha!
En fait le mystère n'est pas si..épais.
En réalité, un hash md5 n'est pas une chaine de caractère mais une valeur de 128 bits.
On a quatre entiers de 32 bits h1, h2, h3, h4, qui ont une valeur initiale et auxquels on ajoute des calculs, des calculs et encore des calculs.
A la fin, on va imprimer ces entiers sous forme hexadécimale (c'est pour ça que tu as des nombres et des lettres, mais les lettres n'iront pas plus loin que f).
Sous forme hexadécimale, un entier va produire 8 digits: xxxxxxxx
A la fin on va concaténer les représentations hexadécimales des 4 entiers, ce qui donnera 4 fois 8 digits. Et voilà... :-)
En fait le mystère n'est pas si..épais.
En réalité, un hash md5 n'est pas une chaine de caractère mais une valeur de 128 bits.
On a quatre entiers de 32 bits h1, h2, h3, h4, qui ont une valeur initiale et auxquels on ajoute des calculs, des calculs et encore des calculs.
A la fin, on va imprimer ces entiers sous forme hexadécimale (c'est pour ça que tu as des nombres et des lettres, mais les lettres n'iront pas plus loin que f).
Sous forme hexadécimale, un entier va produire 8 digits: xxxxxxxx
A la fin on va concaténer les représentations hexadécimales des 4 entiers, ce qui donnera 4 fois 8 digits. Et voilà... :-)
Jean Marc >
Merci mais Wikipedia est la premiere chose que je fais avant google quand j'ai une interrogation =D. Mais j'avou avoir ete quelque peu largue par l'article...
Kilian >
Merci pour l'info. Cependant je ne comprend toujours pas ce que ca change. A la fin de l'operation, on se retrouve tout de meme avec une chaine de 32 caracteres. que se soit des bananes ou la concatenation des 4 int sous forme hexa.
Petite question :
Peut il y avoir plusieurs chaines ("papa est en haut" et "les donughts cest bon" par exemple) qui generent (au bout de l'operation) une meme chaine md5 ? Je ne pense pas, et c'est a partir de la que se base toute mon interrogation.
Merci mais Wikipedia est la premiere chose que je fais avant google quand j'ai une interrogation =D. Mais j'avou avoir ete quelque peu largue par l'article...
Kilian >
Merci pour l'info. Cependant je ne comprend toujours pas ce que ca change. A la fin de l'operation, on se retrouve tout de meme avec une chaine de 32 caracteres. que se soit des bananes ou la concatenation des 4 int sous forme hexa.
Petite question :
Peut il y avoir plusieurs chaines ("papa est en haut" et "les donughts cest bon" par exemple) qui generent (au bout de l'operation) une meme chaine md5 ? Je ne pense pas, et c'est a partir de la que se base toute mon interrogation.
Salut,
Peut il y avoir plusieurs chaines ("papa est en haut" et "les donughts cest bon" par exemple) qui generent (au bout de l'operation) une meme chaine md5 ? Je ne pense pas, et c'est a partir de la que se base toute mon interrogation.
On peut forcément puisqu'on travaille avec un résultat 'fini' (on n'a que 128 bits à notre disposition), et ça c'est déjà produit, cela s'appelle une collision...
Pour le reste, 32 caractères en hexa, ça fait la même chose que 128 bits : soit environ 3,4x10^38.
Peut il y avoir plusieurs chaines ("papa est en haut" et "les donughts cest bon" par exemple) qui generent (au bout de l'operation) une meme chaine md5 ? Je ne pense pas, et c'est a partir de la que se base toute mon interrogation.
On peut forcément puisqu'on travaille avec un résultat 'fini' (on n'a que 128 bits à notre disposition), et ça c'est déjà produit, cela s'appelle une collision...
Pour le reste, 32 caractères en hexa, ça fait la même chose que 128 bits : soit environ 3,4x10^38.
Salut,
j'ajouterais que MD5 représente donc 2^128 soit 3,4.10^38 possibilités ( équivaut aussi à 16^32 si on se base sur le représentation textuelle/hexa).
Donc effectivement le risque de télescopage n'est pas nul, mais assez peu probable dans la plus part des cas.
Et le but de MD5 comme les autres fonctions de hashage est de faire un 'résumé' des données d'origine afin de vérifier leur validité dans le cas d'un transféré, ou de valider un mot de passe mais en aucun cas de retrouver les données sources depuis le hash.
Si on traite un nombre de données très très élevé on peu choisir un autre type d'algo de hashage comme SHA qui travail sur 160bits (1,46.10^48 possibilités)
j'ajouterais que MD5 représente donc 2^128 soit 3,4.10^38 possibilités ( équivaut aussi à 16^32 si on se base sur le représentation textuelle/hexa).
Donc effectivement le risque de télescopage n'est pas nul, mais assez peu probable dans la plus part des cas.
Et le but de MD5 comme les autres fonctions de hashage est de faire un 'résumé' des données d'origine afin de vérifier leur validité dans le cas d'un transféré, ou de valider un mot de passe mais en aucun cas de retrouver les données sources depuis le hash.
Si on traite un nombre de données très très élevé on peu choisir un autre type d'algo de hashage comme SHA qui travail sur 160bits (1,46.10^48 possibilités)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
Peut il y avoir plusieurs chaines ("papa est en haut" et "les donughts cest bon" par exemple) qui generent (au bout de l'operation) une meme chaine md5 ?
md5 c'est une fonction de hachage comme tu l'as bien constater.
Vu qu'elle est sur 128 bits le risque de collisions est vraiement très très minimal, mais pas parfait.
Personnellement je ne vais pas chercher une colission pour le md5 ;-)
Peut il y avoir plusieurs chaines ("papa est en haut" et "les donughts cest bon" par exemple) qui generent (au bout de l'operation) une meme chaine md5 ?
md5 c'est une fonction de hachage comme tu l'as bien constater.
Vu qu'elle est sur 128 bits le risque de collisions est vraiement très très minimal, mais pas parfait.
Personnellement je ne vais pas chercher une colission pour le md5 ;-)
A la fin de l'operation, on se retrouve tout de meme avec une chaine de 32 caracteres. que se soit des bananes ou la concatenation des 4 int sous forme hexa.
Oui. On reprend nos h1, h2, h3, h4, tous des entiers qui contiennent notre hash.
Comme je l'ai dit la représentation d'un entier en hexa prend 8 caractères.
Exemple si h1 = 0, ça donnera 00000000, si h1 = 15 ça donnera 0000000f
A la fin on va concaténer la représentation hexa de nos 4 entiers.
Ca va nous faire 4 entiers * 8 caractères = 32 caractères.
Peut il y avoir plusieurs chaines ("papa est en haut" et "les donughts cest bon" par exemple) qui generent (au bout de l'operation) une meme chaine md5 ?
Oui, je crois que c'est rare mais ça arrive. On appelle ça une collision.
Oui. On reprend nos h1, h2, h3, h4, tous des entiers qui contiennent notre hash.
Comme je l'ai dit la représentation d'un entier en hexa prend 8 caractères.
Exemple si h1 = 0, ça donnera 00000000, si h1 = 15 ça donnera 0000000f
A la fin on va concaténer la représentation hexa de nos 4 entiers.
Ca va nous faire 4 entiers * 8 caractères = 32 caractères.
Peut il y avoir plusieurs chaines ("papa est en haut" et "les donughts cest bon" par exemple) qui generent (au bout de l'operation) une meme chaine md5 ?
Oui, je crois que c'est rare mais ça arrive. On appelle ça une collision.
On part d'un ensemble d'une infinité de possibilités de chaine de caractères différentes (et pas forcément des caractères d'ailleurs) que MD5 réduit à 3,4.10^38 possibilités, même si c'est grand, c'est fini.
Donc il y a une infinité de façon de générer des collisions -- même si c'est peu probable dans la pratique.
Et heureusement que ces collisions existent, sinon ça faudrait dir que l'algo de hash est réversible et c'est justement l'inverse qu'on veut -- afin par exemple de ne pas pouvoir déchiffrer un mot de passe crypté d'après son hash.
Et ca voudrait dire également que le nombre de possibilités de hash serait infini, donc leur taille serait indéfinie aussi -- ca serait un algo réversible et non destructeur , une compression en somme (ZIP ...).
En espérant avoir réussi à rester clair :-)
Donc il y a une infinité de façon de générer des collisions -- même si c'est peu probable dans la pratique.
Et heureusement que ces collisions existent, sinon ça faudrait dir que l'algo de hash est réversible et c'est justement l'inverse qu'on veut -- afin par exemple de ne pas pouvoir déchiffrer un mot de passe crypté d'après son hash.
Et ca voudrait dire également que le nombre de possibilités de hash serait infini, donc leur taille serait indéfinie aussi -- ca serait un algo réversible et non destructeur , une compression en somme (ZIP ...).
En espérant avoir réussi à rester clair :-)
Carrement, bah je te remercie.
Je vois mieux le sens du terme algo destructeur.
Allez, juste une petite derniere question pour rebondir sur ce que tu dit :
D'apres mes recherches le SHA1 serait plus secure que le md5.
L'algo est different, ok. Mais toujours en restant a un niveau tres beta :
la generation du SHA1 groupe 64 caracteres contre 32 pour le md5. Donc tres nettement moins de collisions. Cela ne permet pas de plus simplement trouver la bonne chaine d'origine via une methode bruteforce ?
Je vois mieux le sens du terme algo destructeur.
Allez, juste une petite derniere question pour rebondir sur ce que tu dit :
D'apres mes recherches le SHA1 serait plus secure que le md5.
L'algo est different, ok. Mais toujours en restant a un niveau tres beta :
la generation du SHA1 groupe 64 caracteres contre 32 pour le md5. Donc tres nettement moins de collisions. Cela ne permet pas de plus simplement trouver la bonne chaine d'origine via une methode bruteforce ?
Non car il y a beaucoup plus de possibilités à essayer, mais dans un cas comme dans l'autre c'est aussi une question de chance et de statistique : même avec un hash sur 512 bits, rien n'interdit de tomber sur le bon mdp dans les premiers essais même si c'est très peu probable. Et pour les collisions il y en aura toujours théoriquement le même nombre : une infinité (vu qu'il y a une infinité de possibilité de source).
Une infinite oui. Mais la frequence differe.
disons X = nombre de combinaisons possible md5 et Y nombre de combinaisons sha1, Y etant beaucoup plus grand que X.
on imagine un programme qui genere a partir de la chaine 0 (jusqu'a l'infini) chaque hash.
en md5 il y aura theoriquement une collision toutes les X generations
en sha 1 toutes les Y generations.
Pour casser un hash quelque soit son type il n'y a que le bruteforce. Cependant en md5, lorsque la boucle aura trouve une correspondance, tu auras (theoriquement toujours) plus de chance de tomber sur un faux ami que sur la bonne origine comparé au hash sha1...
Mais je fais probablement erreur....
disons X = nombre de combinaisons possible md5 et Y nombre de combinaisons sha1, Y etant beaucoup plus grand que X.
on imagine un programme qui genere a partir de la chaine 0 (jusqu'a l'infini) chaque hash.
en md5 il y aura theoriquement une collision toutes les X generations
en sha 1 toutes les Y generations.
Pour casser un hash quelque soit son type il n'y a que le bruteforce. Cependant en md5, lorsque la boucle aura trouve une correspondance, tu auras (theoriquement toujours) plus de chance de tomber sur un faux ami que sur la bonne origine comparé au hash sha1...
Mais je fais probablement erreur....
Dans le système c'est le hash qui est stocké, pas le MDP. Donc plusieurs MDP en clair peuvent en théorie être acceptés pour un même hash (en théorie car si le 1er mdp, celui voulu par l'utilisateur est sur 8 caractères, il n'y aura peut être des collisions qu' avec des chaines de plus de 10000 caractères ou avec des caractères non 'imprimables' ou ...). Je pense qu'en pratique (je pense car je ne suis pas spécialiste en cryptographie) les collisions sont assez négligeables dans ce sens, mais permettent tout de même l'irréversibilité de l'algo.
Il sera donc statistiquement plus long de trouver le premier mdp valable pour un hash en SHA qu'en MD5 vu que l'ensemble est plus grand.
Il sera donc statistiquement plus long de trouver le premier mdp valable pour un hash en SHA qu'en MD5 vu que l'ensemble est plus grand.
les collisions sont assez négligeables dans ce sens, mais permettent tout de même l'irréversibilité de l'algo.
Ce n'est pas parce les collisions sont négligeables qu'elles donnent un algo irréversible.
L'algorithme est par construction non-bijectif, puisque destructif d'une grande majorité de la chaine de départ.
Ce n'est pas parce les collisions sont négligeables qu'elles donnent un algo irréversible.
L'algorithme est par construction non-bijectif, puisque destructif d'une grande majorité de la chaine de départ.
Il me semble que des chercheurs ont réussi à produire 2 chaînes de caractères donnant la même somme haché.
Ces deux chaînes avait des caractéristiques particulière, elles contenaient, si je ne m'abuse, des données de "bourrage" qui paraissaient aléatoires.
Dans la pratique, même si tu connais le mot de passe d'origine tu ne pourra pas construire une chaîne ayant le même hash. Il faudrait que tu fasse exprès que le premier contienne du bourrage pour pouvoir créer le second.
C'est pour ça que le hachage est aussi utilisé comme signature de message, si quelqu'un veux modifier le message, il faut qui crée un chaîne qui ait le même hachage, ce qui est techniquement impossible.
Ces deux chaînes avait des caractéristiques particulière, elles contenaient, si je ne m'abuse, des données de "bourrage" qui paraissaient aléatoires.
Dans la pratique, même si tu connais le mot de passe d'origine tu ne pourra pas construire une chaîne ayant le même hash. Il faudrait que tu fasse exprès que le premier contienne du bourrage pour pouvoir créer le second.
C'est pour ça que le hachage est aussi utilisé comme signature de message, si quelqu'un veux modifier le message, il faut qui crée un chaîne qui ait le même hachage, ce qui est techniquement impossible.
D'accord, mais au passage j'ai une nouvelle question (quoi encore ??) :
en quoi le sha1 serait plus long a casser que le md5, dans les 2 cas il faudra faire du brute force, et par consequent une boucle qui hash puis compare.
Cette operation mettra autant de temps pour l'un que pour l'autre non ?
en quoi le sha1 serait plus long a casser que le md5, dans les 2 cas il faudra faire du brute force, et par consequent une boucle qui hash puis compare.
Cette operation mettra autant de temps pour l'un que pour l'autre non ?