2008-10-10 6 views
5

Ich versuche, äquivalente MD5-Hashes in JavaScript und .Net zu generieren. Da ich es auch nicht getan habe, habe ich mich entschieden, gegen eine Drittanbieter-Berechnung zu verwenden - diese web site für das Wort "Passwort". Ich werde später in Salze hinzufügen, aber im Moment kann ich nicht die .net-Version erhalten mit der Website des Hash übereinstimmen:Warum entspricht mein .net-berechneter MD5-Hash nicht dem auf einer Website berechneten Hash?

5f4dcc3b5aa765d61d8327deb882cf99 

Ich vermute, es eine Codierung Problem ist, aber ich Ich habe ungefähr 8 verschiedene Variationen von Methoden zur Berechnung eines MD5-Hashes in .Net ausprobiert, und keines von ihnen entspricht dem, was ich in JavaScript (oder von der Website) erhalten habe. Diese MSDN example ist eine der Methoden, die ich versucht habe, die in diesem Hash-Ergebnisse, die ich häufig erhalten haben:

7c6a180b36896a0a8c02787eeafb0e4c 

Edit: Leider habe ich aus Versehen verschiedene Quellstrings zu den beiden unterschiedlichen Implementierungen wurden bereitgestellt. EBAK. : -/Noch immer interessiert sein, Ihre Antwort auf das Follow-up zu hören.

Bonus Frage: Welche Codierung/Format würde am besten Hashwerte in einer Datenbank speichern?

+0

googeln Was Sie für den JavaScript-Hash verwenden? Der Grund, warum ich frage, ist, dass wenn es für die Sicherheit ist, sollte es nur auf dem Server generiert werden. –

+0

Um von dieser Diskussion ein wenig zurückzutreten, fühle ich, dass [Thomas Ptaceks Beitrag] (http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you -need-to-know-about-secure-password-schemes.html) (als Antwort auf eine [Jeff Atwood Post] (http://blog.codinghorror.com/rainbow-hash-cracking/) zu einem ähnlichen Thema) erklärt am besten, warum Sie nichts wie MD5 für Passwort Hashing verwenden sollten. Literatur-Empfehlungen. –

Antwort

9

den Code aus dem MSDN-Website Laufen Sie zitieren:

// 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")); 
     } 

kehrt:

5f4dcc3b5aa765d61d8327deb882cf99 
+0

Wahr. : -/Ich habe in den beiden Implementierungen verschiedene Quelltexte verwendet. Dummkopf! – pc1oad1etter

0

ich den gleichen Wert wie die Website für das Wort „Passwort“ erhalten:

$ echo -n password | md5 
5f4dcc3b5aa765d61d8327deb882cf99 

Ohne den Code sehen Sie tatsächlich verwenden, ist es schwer zu sagen, was falsch sein könnte gehen.

Wie zum Speichern von Hashes in einer Datenbank, speichere ich sie als Hex-Zeichenfolge. Obwohl die meisten Datenbanken binäre Blobs verarbeiten können, spart die Speicherung als Binärdatei nur die Hälfte des Speicherplatzes und sie sind schwieriger abzufragen und zu manipulieren. Chancen sind die anderen Daten, die Sie zusammen mit dem Hash speichern, ist sowieso größer.

+0

Oder verwenden Sie Base64, die nur die Binärzahl um ein Drittel erweitert, anstatt es zu verdoppeln. Nicht, dass MD5 für Kennworthashes sicher ist. –

0

Diese VB.Net Version gibt die gleichen Ergebnisse wie MySQL aus eigener Erfahrung:

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

Haben Sie einen Code, wie Sie dies zu tun versuchen?

(Antwort auf das zweite Q) Ich verwende normalerweise ein String-Feld und speichern Sie es als BASE64-Codierung. Einfach genug, um damit zu arbeiten und Vergleiche anzustellen.

/// <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

Ich hatte mit einer der Methoden verbunden, die ich verwendete - in der Post. – pc1oad1etter

0

Es sollte auch, dass MD5-Summen festgestellt werden kann, mit Rainbow-Tabellen geknackt werden (es gibt kostenlose Programme im Internet, die eine MD5-Summe als Eingabe akzeptieren und einen Klartext ausgeben - normalerweise ein Passwort.

SHA1 ist wahrscheinlich eine bessere Wahl ...

EDIT: Zugabe von Salz ist ein guter Weg, um Ihre Hash zu verhindern, dass
EDIT 2 umgekehrt wird: wenn ich Ihren Beitrag zu lesen gestört hätte, hätte ich habe bemerkt, dass Sie bereits erwähnt, dass Sie planen, hinzufügen Salz

+0

Ich würde behaupten, sogar mit einem Salz MD5 ist nicht sicher genug. –

+0

@Ramhound nun 5 Jahre nach deinem Kommentar ist es definitiv nicht sicher =) – Gaspa79

3

Dies geschieht, weil irgendwie Sie password1 statt password sind Hashing oder vielleicht die password falsch zu berechnen und es irgendwie gleich geheimnisvoll password1.

Sie können einen Reverse-Lookup des MD5-Hash tun, vorausgesetzt, Sie von

7c6a180b36896a0a8c02787eeafb0e4c