2008-10-10 5 views
5

J'essaie de générer des hachages MD5 équivalents dans JavaScript et .Net. N'ayant pas fait non plus, j'ai décidé d'utiliser contre un calcul de tiers - ce web site pour le mot "mot de passe". Je vais ajouter des sels plus tard, mais pour le moment, je ne peux pas la version .net pour correspondre avec le hachage du site web:Pourquoi mon hachage MD5 .net-calculé n'est-il pas équivalent au hachage calculé sur un site Web?

5f4dcc3b5aa765d61d8327deb882cf99 

Je suppose que c'est un problème d'encodage, mais je J'ai essayé environ 8 différentes variantes de méthodes pour calculer un hachage MD5 dans .Net, et aucune ne correspond à ce que j'ai obtenu en JavaScript (ou sur le site web). Ce MSDN example est l'une des méthodes que j'ai essayé, ce qui se traduit dans ce hachage que j'ai souvent reçu:

7c6a180b36896a0a8c02787eeafb0e4c 

Edit: Malheureusement, j'ai accidentellement dispensons des différentes chaînes de source pour les deux implémentations différentes. EBSAK. : -/Etes toujours intéressé d'entendre votre réponse au suivi. Question de bonus: quel encodage/format serait le mieux pour stocker des valeurs hachées dans une base de données?

+0

Qu'est-ce que vous utilisez le hachage javascript pour? La raison pour laquelle je demande est que si c'est pour la sécurité, il devrait seulement être généré sur le serveur. –

+0

Pour prendre un peu de recul de cette discussion, je pense que [post de Thomas Ptacek] (http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you -need-to-know-about-secure-password-schemes.html) (en réponse à une [post de Jeff Atwood] (http://blog.codinghorror.com/rainbow-hash-cracking/) sur un sujet similaire) explique mieux pourquoi vous ne devriez pas utiliser quelque chose comme MD5 pour le hachage de mot de passe. Lecture recommandée. –

Répondre

9

L'exécution du code à partir du site MSDN vous cite:

// Hash an input string and return the hash as 
    // a 32 character hexadecimal string. 
    static string getMd5Hash(string input) 
    { 
      // Create a new instance of the MD5CryptoServiceProvider object. 
      MD5 md5Hasher = MD5.Create(); 

      // Convert the input string to a byte array and compute the hash. 
      byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input)); 

      // Create a new Stringbuilder to collect the bytes 
      // and create a string. 
      StringBuilder sBuilder = new StringBuilder(); 

      // Loop through each byte of the hashed data 
      // and format each one as a hexadecimal string. 
      for (int i = 0; i < data.Length; i++) 
      { 
       sBuilder.Append(data[i].ToString("x2")); 
      } 

      // Return the hexadecimal string. 
      return sBuilder.ToString(); 
     } 


     static void Main(string[] args) 
     { 
      System.Console.WriteLine(getMd5Hash("password")); 
     } 

retours:

5f4dcc3b5aa765d61d8327deb882cf99 
+0

True. : -/J'utilisais différentes chaînes source dans les deux implémentations. Idiot! – pc1oad1etter

0

je reçois la même valeur que ce site web pour le mot « password »:

$ echo -n password | md5 
5f4dcc3b5aa765d61d8327deb882cf99 

Sans voir le code que vous utilisez réellement, il est difficile de dire ce qui pourrait aller mal. En ce qui concerne le stockage des hachages dans une base de données, je les stocke comme une chaîne hexadécimale. Bien que la plupart des bases de données puissent gérer les blobs binaires, les stocker en tant que binaires n'économise que la moitié de l'espace et est plus difficile à interroger et à manipuler. Les chances sont les autres données que vous stockez avec le hachage est plus grande de toute façon.

+0

Ou utilisez Base64, qui ne fait que grossir le binaire d'un tiers au lieu de le doubler. Pas que MD5 est sûr à utiliser pour les hachages de mot de passe. –

0

Cette version VB.Net donne les mêmes résultats que MySQL à partir de ma propre expérience:

Private Function MD5Hash(ByVal str As String) As String 

    Dim md5 As MD5 = MD5CryptoServiceProvider.Create 
    Dim hashed As Byte() = md5.ComputeHash(Encoding.Default.GetBytes(str)) 
    Dim sb As New StringBuilder 

    For i As Integer = 0 To hashed.Length - 1 
     sb.AppendFormat("{0:x2}", hashed(i)) 
    Next 

    Return sb.ToString 

End Function 
0

Vous avez un code que vous essayez de le faire?

(réponse à la deuxième Q) J'utilise généralement un champ de chaîne et le stocke en tant que codage BASE64. Assez facile de travailler avec et de faire des comparaisons.

/// <summary> 
/// Gets the Base 64 encoded SHA1 hashed password 
/// </summary> 
/// <returns>A Base 64 encoded string representing the SHA1 Hash of the password</returns> 
public string ToBase64SHA1String() 
{ 
    return Convert.ToBase64String(this.GetSHA1HashCode()); 

} 
+0

J'avais lié à l'une des méthodes que j'utilisais - dans le post. – pc1oad1etter

0

Il convient également de noter que les sommes MD5 peuvent être craquées avec des tables arc-en-(il y a programmes gratuits sur Internet acceptant une somme MD5 en entrée et produisant un texte en clair - qui est normalement un mot de passe)

SHA1 est probablement un meilleur choix ...

EDIT: l'ajout de sel est une bonne façon d'éviter d'être votre hachage d'être inversé
EDIT 2: si j'avais pris la peine de lire votre post, je l'aurais remarqué que vous avez déjà dit que vous prévoyez d'ajouter sel

+0

Je dirais même avec un sel MD5 n'est pas assez sécurisé. –

+0

@Ramhound bien maintenant 5 ans après votre commentaire, il n'est certainement pas sécurisé =) – Gaspa79

3

Cela se produit parce que d'une certaine manière vous Hashage password1 au lieu de password, ou peut-être le calcul password de manière incorrecte et d'une certaine manière égale mystérieusement password1.

Vous pouvez faire une recherche inversée du hachage md5 que vous avez fourni par googler

7c6a180b36896a0a8c02787eeafb0e4c 
Questions connexes