none
C# String mit MD5 Verschlüsseln RRS feed

  • Frage

  • Hallo,

    wie der Name schon sagt möchte ich einen String mit Hilfe von MD5 verschlüsseln, für eine spätere Passwort abfrage.

    Ich habe nun schon mehrere Foren durchgestöbert und schon mehrere Snippets ausprobiert doch nie komme ich auf den gleichen Hash wie in meiner Datenbank...

    Der Hash in meiner DB von a ist:

    0cc175b9c0f1b6a831c399e269772661

    Der Code von einem Snippet ist so:

    4C4F3B[...]FCBB

    Von folgendem Snippet:

    string passwort = Properties.Settings.Default.password;
    
    MD5 md5Hasher = MD5.Create();
    string a = BitConverter.ToString(md5Hasher.ComputeHash(Encoding.Default.GetBytes(passwort))).Replace("-", "");

    Bitte um Hilfe!

    Danke

    Sonntag, 12. August 2012 19:28

Antworten

  • Hallo,

    wenn Deine DB ein SQL Server ist, so entspräche:

    -- 0x0CC175B9C0F1B6A831C399E269772661
    SELECT HASHBYTES('MD5', 'a')

    in C#:

            public static string GetMD5Hash(string value)
            {
                using (var md5 = System.Security.Cryptography.MD5.Create())
                {
                    // ANSI (varchar)
                    var valueBytes = Encoding.Default.GetBytes(value);
                    var md5HashBytes = md5.ComputeHash(valueBytes);
                    var builder = new StringBuilder(md5HashBytes.Length * 2);
                    foreach (var md5Byte in md5HashBytes)
                        builder.Append(md5Byte.ToString("X2"));
                    return builder.ToString();
                }
            }

    getestet mit:

                string password = "a";
                var passwordHash = GetMD5Hash(password);
                // a => 0CC175B9C0F1B6A831C399E269772661
                Console.WriteLine("{0} => {1}", password, passwordHash);

    Beachte dass bei Unicode - das N macht den Unterschied - was anderes rauskommt:

    -- 0x4144E195F46DE78A3623DA7364D04F11
    SELECT HASHBYTES('MD5', N'a')
    Unicode wäre wiederum zu empfehlen, denn die lokale ANSI-Codepage kann je nach Rechner abweichen
    und wenn Sonderzeichen zugelassen sind, könnte ein abweichendes Ergebnis herauskommen.

    Gruß Elmar

    Sonntag, 12. August 2012 19:45
    Beantworter

Alle Antworten

  • Hallo,

    wenn Deine DB ein SQL Server ist, so entspräche:

    -- 0x0CC175B9C0F1B6A831C399E269772661
    SELECT HASHBYTES('MD5', 'a')

    in C#:

            public static string GetMD5Hash(string value)
            {
                using (var md5 = System.Security.Cryptography.MD5.Create())
                {
                    // ANSI (varchar)
                    var valueBytes = Encoding.Default.GetBytes(value);
                    var md5HashBytes = md5.ComputeHash(valueBytes);
                    var builder = new StringBuilder(md5HashBytes.Length * 2);
                    foreach (var md5Byte in md5HashBytes)
                        builder.Append(md5Byte.ToString("X2"));
                    return builder.ToString();
                }
            }

    getestet mit:

                string password = "a";
                var passwordHash = GetMD5Hash(password);
                // a => 0CC175B9C0F1B6A831C399E269772661
                Console.WriteLine("{0} => {1}", password, passwordHash);

    Beachte dass bei Unicode - das N macht den Unterschied - was anderes rauskommt:

    -- 0x4144E195F46DE78A3623DA7364D04F11
    SELECT HASHBYTES('MD5', N'a')
    Unicode wäre wiederum zu empfehlen, denn die lokale ANSI-Codepage kann je nach Rechner abweichen
    und wenn Sonderzeichen zugelassen sind, könnte ein abweichendes Ergebnis herauskommen.

    Gruß Elmar

    Sonntag, 12. August 2012 19:45
    Beantworter
  • Vielen Vielen Lieben dank :)!
    Funktioniert jetzt super !
    Sonntag, 12. August 2012 20:05
  • Hallo,

    nachdem die erste Hürde genommen ist, solltest Du Deine Hashcodes um einen Salt ergänzen, wenn sie für Kennwörter genutzt werden sollen - wie das password vermuten lässt.

    Denn das so taugt es nicht als Verschlüsselung, da solch einfache Hashes mit Hilfe von Rainbow Tables in Null-komma-nix geknackt werden.

    Gruß Elmar

    Sonntag, 12. August 2012 20:26
    Beantworter
  • Hallo,

    Danke für den Hinweis, 
    Nur führt es bei meinem Webspace zu verschiedenen Ergebnissen,

    Also muss ich bei der mehrfachen Verschlüsselung bleiben.

    Gruß, Angelo

    Montag, 13. August 2012 12:38
  • Hi,

    darin liegt der Sinn, einen Salt hinzuzufügen. Damit ist der erzeugte Hash trotz identischer Passworte dennoch ein komplett anderer.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 13. August 2012 14:22
    Moderator
  • Hallo,

    Ist alles richtig, nur meine ich das es bei immer der selben Verschlüsselungsmethode auch zu unerwarteten Ergebnissen führen kann.

    Gruß, Angelo

    Montag, 13. August 2012 14:38