md5 [résolu]

md5 [résolu] - C - Programmation

Marsh Posté le 11-12-2006 à 14:53:35    

Bonjour,
 
J'ai un programme qui lit dans un fichier un mot md5. Ce code est donc enregistré dans un char * de 32 octets.
Ce programme est un serveur ; si on fait un telnet, le serveur demande un mot de passe.
Le mot de passe hashé avec md5 est un unsigned char * de 16 octets.
Comment comparer ?
En gros, je voudrais savoir, comment réécrire le mot lu dans le fichier pour qu'il devienne un 'vrai' md5.

Message cité 2 fois
Message édité par nORKy le 12-12-2006 à 08:42:28
Reply

Marsh Posté le 11-12-2006 à 14:53:35   

Reply

Marsh Posté le 11-12-2006 à 18:29:52    

"lu" pas "lit'
et "devienne" pas "devient"

Reply

Marsh Posté le 11-12-2006 à 19:04:23    

nORKy a écrit :

Bonjour,
 
J'ai un programme qui lit dans un fichier un mot md5. Ce code est donc enregistré dans un char * de 32 octets.
Ce programme est un serveur ; si on fait un telnet, le serveur demande un mot de passe.
Le mot de passe hashé avec md5 est un unsigned char * de 16 octets.
Comment comparer ?
En gros, je voudrais savoir, comment réécrire le mot lit dans le fichier pour qu'il devient un 'vrai' md5.


 
c'est quoi la question de programmation là dedans ?


---------------
Töp of the plöp
Reply

Marsh Posté le 11-12-2006 à 19:46:21    

nORKy a écrit :


J'ai un programme qui lit dans un fichier un mot md5. Ce code est donc enregistré dans un char * de 32 octets.
 
Le mot de passe hashé avec md5 est un unsigned char * de 16 octets.
Comment comparer ?


 
 
Salut,
 
Déjà, un hash MD5 fait 128 bits soit 16 octets donc je ne comprend pas pourquoi le stocker dans un char* de 32 octets.
 
Ensuite, tu n'as qu'à comparer 2 tableaux... C'est quoi le problème ?

Reply

Marsh Posté le 11-12-2006 à 20:26:15    

anordem a écrit :

Déjà, un hash MD5 fait 128 bits soit 16 octets donc je ne comprend pas pourquoi le stocker dans un char* de 32 octets.


Le hash MD5 fait peut-être 16 octets mais la chaîne affichée en fait 32.
Il est probable que ce soit la chaîne telle qu'on l'affiche qui ait été stockée et non le hash lui-même...
 
Donc pour répondre à _darkalt3_; tu convertis ta chaîne stockée sur 32 octets en binaire, c'est à dire que si t'as les valeurs 'a', '1', '2', '3' (soit 4 octets), cela te donnera en final le nombre "0xa123" soit 2 octets
Puis tu compares le calcul avec le mot de passe reçu...
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 12-12-2006 à 01:55:49    

Sve@r a écrit :

Le hash MD5 fait peut-être 16 octets mais la chaîne affichée en fait 32.
Il est probable que ce soit la chaîne telle qu'on l'affiche qui ait été stockée et non le hash lui-même...


 
Effectivement, je n'avais pas vu ça sous cet angle...  :D Je pensais que le hash était stocké en hexa dans le fichier.
 

Reply

Marsh Posté le 12-12-2006 à 08:41:10    

bon, je donne la solution que j'ai trouvé
Pour faire un hash md5 : (librairie openssl)

Code :
  1. md = MD5(mot, strlen(mot), NULL); // renvoi un ptr sur tableau static


 
et donc pour le comparer a une chaine :

Code :
  1. static char *my_md5(unsigned char *md)
  2. {
  3.   int i;
  4.   static char buf[80];
  5.   memset(buf, 0, 80);
  6.   for (i = 0; i < MD5_DIGEST_LENGTH; i++)
  7.     sprintf(&(buf[i*2]),"%02x",md[i]);
  8.   return(buf);
  9. }


 

Code :
  1. if (!strcmp(my_md5(md), chaine)) {
  2. }

Reply

Marsh Posté le 12-12-2006 à 20:33:35    

nORKy a écrit :

Code :
  1. md = MD5(mot, strlen(mot), NULL); // renvoi un ptr sur tableau static



 
Gaffe au pointeur static car la valeur du pointeur renvoyé ne change jamais.
Ex:

Code :
  1. md1 = MD5(mot1, strlen(mot1), NULL);
  2. md2 = MD5(mot2, strlen(mot2), NULL);


 
Ben quel que soit "mot1" et "mot2", au final, tu te retrouves avec md1=md2...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 12-12-2006 à 23:07:30    

Sve@r a écrit :

Gaffe au pointeur static car la valeur du pointeur renvoyé ne change jamais.
Ex:

Code :
  1. md1 = MD5(mot1, strlen(mot1), NULL);
  2. md2 = MD5(mot2, strlen(mot2), NULL);


 
Ben quel que soit "mot1" et "mot2", au final, tu te retrouves avec md1=md2...


 
Oui, je sais, mais comme je m'en sers pas 2 fois en meme temps...
Chacun fait en fonction de son utilisation  ;)

Reply

Marsh Posté le 13-12-2006 à 23:45:51    

nORKy a écrit :

Oui, je sais, mais comme je m'en sers pas 2 fois en meme temps...
Chacun fait en fonction de son utilisation  ;)


 
Huuuummmm... Je croyais moi aussi pouvoir tout contrôler de mon clavier. Et puis un jour, j'ai fait un truc de ce style

while (strtok(..., ...) != NULL)
{
     <....>
     <....>
     sous_traitement();
}


 
Et dans ma fonction "sous_traitement()"

while (strtok(..., ...) != NULL)
{
     <....>
}


Ben t'auras vite compris que ça n'a jamais marché. Mais avant de me rendre compte du pb...


Message édité par Sve@r le 13-12-2006 à 23:46:46

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 13-12-2006 à 23:45:51   

Reply

Marsh Posté le 14-12-2006 à 20:29:19    

Oui, mais c'est un peu différent :-) je vais pas imbriqué des fonctions pour traiter une chaine que je veux juste hasher :-)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed