md5 (wordpress) Passwortverschlüsselung in C#

Lesezeit: 3 Minuten

Ich möchte die asp.net-Webanwendung des Benutzerformulars authentifizieren. Die für die Anwendung verwendete Datenbank ist MySQL und das in der Datenbank gespeicherte Passwort ist in einem verschlüsselten Format, das aus der WordPress-Anwendung generiert wird. Ich muss das Passwort verschlüsseln, damit ich das verschlüsselte Passwort mit dem DB-Passwort vergleichen kann.

Mein Passwort: Push@123 Verschlüsseltes Passwort: $P$BGW0cKLlkN6VlZ7OqRUvIY1Uvo/Bh9/

So generieren Sie dieses verschlüsselte Passwort in c#

  • Das ist eine WordPress-spezifische Frage. Wie generiert WordPress diesen Hash? Was hast du beim Lesen der Dokumentation?

    – Paulo

    7. Dezember 2015 um 14:26 Uhr

Es hat eine Weile gedauert, aber hier haben Sie eine fast 1: 1-Konvertierung von PHP nach C # funktioniert:

using System;
using System.Text;
using System.Security.Cryptography;
using System.Linq;

namespace WordPressHash {
    public class Program {
        private static string itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

        public static void Main(string[]args) {
            string StrPassword = "Push@123";
            string expected = "$P$BGW0cKLlkN6VlZ7OqRUvIY1Uvo/Bh9/";

            string computed = MD5Encode(StrPassword, expected);

            Console.WriteLine(StrPassword);
            Console.WriteLine(computed);
            Console.WriteLine("Are equal? " + expected.Equals(computed));
        }

        static string MD5Encode(string password, string hash) {
            string output = "*0";
            if (hash == null) {
                return output;
            }

            if (hash.StartsWith(output))
                output = "*1";

            string id = hash.Substring(0, 3);
            // We use "$P$", phpBB3 uses "$H$" for the same thing
            if (id != "$P$" && id != "$H$")
                return output;

            // get who many times will generate the hash
            int count_log2 = itoa64.IndexOf(hash[3]);
            if (count_log2 < 7 || count_log2 > 30)
                return output;

            int count = 1 << count_log2;

            string salt = hash.Substring(4, 8);
            if (salt.Length != 8)
                return output;

            byte[]hashBytes = {};
            using(MD5 md5Hash = MD5.Create()) {
                hashBytes = md5Hash.ComputeHash(Encoding.ASCII.GetBytes(salt + password));
                byte[]passBytes = Encoding.ASCII.GetBytes(password);
                do {
                    hashBytes = md5Hash.ComputeHash(hashBytes.Concat(passBytes).ToArray());
                } while (--count > 0);
            }

            output = hash.Substring(0, 12);
            string newHash = Encode64(hashBytes, 16);

            return output + newHash;
        }

        static string Encode64(byte[]input, int count) {
            StringBuilder sb = new StringBuilder();
            int i = 0;
            do {
                int value = (int)input[i++];
                sb.Append(itoa64[value & 0x3f]); // to uppercase
                if (i < count)
                    value = value | ((int)input[i] << 8);
                sb.Append(itoa64[(value >> 6) & 0x3f]);
                if (i++ >= count)
                    break;
                if (i < count)
                    value = value | ((int)input[i] << 16);
                sb.Append(itoa64[(value >> 12) & 0x3f]);
                if (i++ >= count)
                    break;
                sb.Append(itoa64[(value >> 18) & 0x3f]);
            } while (i < count);

            return sb.ToString();
        }
    }
}

Jeder Hash in der Datenbank wird mit Salt und verschlüsselt n Iterationen von md5. Eine kurze Erklärung finden Sie hier: https://codex.wordpress.org/Function_Reference/wp_hash_password

Auf die Salzerzeugung habe ich bewusst verzichtet. Aber wenn Sie es in Zukunft brauchen, sollte es damit beginnen $P$ und mindestens 12 Zeichen lang sein. Mit dieser zusätzlichen Methode können Sie auch neue Passwörter hashen und nicht nur prüfen, ob der Hash korrekt ist.

  • Gute Antwort. Ich habe es als Grundlage für Drupal 7-Hash verwendet. Hier müssen Sie MD5 durch SHA512 ersetzen und beachten, dass drupal mit $S$ beginnt. Der zweite Parameter für Encode64 ist dann 32. Als letzten Punkt musste ich in Encode64 das if (i < count) in if (i <= count) ändern, sonst war mein allerletztes Zeichen falsch!

    – Jonathan Willcock

    4. April 2019 um 8:53 Uhr

  • Schön, danke fürs Teilen, hat mir viel Zeit gespart! 🙂

    – Schikyo

    1. September 2019 um 20:31 Uhr

  • Ich weiß, diese Antwort ist alt, aber Sie haben mir gerade eine Menge Arbeit erspart. Hatte vor einiger Zeit eine Java-Klasse, um genau das mit Springframework zu tun, aber mein Projekt auf C # verschoben. Du hast mein Leben gerade ein ganzes Stück einfacher gemacht

    – ADSquared

    30. April 2020 um 17:16 Uhr

Wahrscheinlich könnte dies der Trick für Sie sein

using System.Security.Cryptography;

    class Program
    {
        static void Main(string[] args)
        {
            string StrPassword = "Push@123";
            using (MD5 md5Hash = MD5.Create())
            {
                string hashPassword = GetMd5Hash(md5Hash, StrPassword);
                Console.WriteLine(hashPassword);
            }
        }
        static string GetMd5Hash(MD5 md5Hash, string input)
        {
            byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            return sBuilder.ToString();
        }
    }

Hash-Funktionen bilden binäre Zeichenfolgen beliebiger Länge auf kleine binäre Zeichenfolgen fester Länge ab. Eine kryptografische Hash-Funktion hat die Eigenschaft, dass es rechnerisch unmöglich ist, zwei unterschiedliche Eingaben zu finden, die denselben Hashwert haben. Das heißt, Hashes von zwei Datensätzen sollten übereinstimmen, wenn die entsprechenden Daten ebenfalls übereinstimmen. Kleine Änderungen an den Daten führen zu großen, unvorhersehbaren Änderungen im Hash.

Die Hash-Größe für den MD5-Algorithmus beträgt 128 Bit.

Die ComputeHash-Methoden der MD5-Klasse geben den Hash als Array von 16 Bytes zurück. Beachten Sie, dass einige MD5-Implementierungen einen hexadezimal formatierten Hash mit 32 Zeichen erzeugen. Um mit solchen Implementierungen zu interagieren, formatieren Sie den Rückgabewert der ComputeHash-Methoden als Hexadezimalwert.

Quelle MSDN: MD5-Klasse

  • Danke für deine Antwort. aber bei mir hat es nicht funktioniert, ich habe es schon probiert. es gernrate falsches Verschlüsselungspasswort

    – Nil Khedekar

    7. Dezember 2015 um 6:53 Uhr


  • Ich habe versucht, Ihr Passwort mit mehreren Hasing-Funktionen zu hashen sha1-online.com aber keiner hat den Hash zurückgegeben, den Sie in Ihrer Frage gepostet haben – ich würde davon ausgehen, dass Ihr Passwort gesalzen wird, bevor es gehasht wird

    – Marco Forberg

    7. Dezember 2015 um 7:48 Uhr

  • @Nilkhedekar: Wenn Sie sich MD5 ansehen Push@123 ist 73B0E2415605797A86CDE2883CAEFF27 und nicht $P$BGW0cKLlkN6VlZ7OqRUvIY1Uvo/Bh9/ Ich bin mir also nicht sicher, welchen Hash Sie zum Konvertieren verwendet haben. Bitte verwende Online-MD5-Hash-Generator überprüfen

    – Mohit S

    7. Dezember 2015 um 7:50 Uhr

Benutzer-Avatar
Ernst Rutherford

Ich habe umgeschrieben crypt_privat php-Methode aus class-phpass.php (siehe /wp-includes/class-phpass.php Ihrer WordPress-Installation), um es in C# zu verwenden.

Geben Sie hier die Bildbeschreibung ein

Das Passwort ist eine vom Benutzer eingegebene Zeichenfolge, die Einstellung ist der Wert user_pass in der wp-Datenbank der Zeile wp_users.

crypt_private gibt den Hash des Passworts zurück. So, Wenn der von crypt_private zurückgegebene Wert gleich dem Einstellungswert ist, ist das Passwort korrekt.

Dies funktioniert, wenn Sie php5 und neuer verwenden auf server mit wordpress.

    private const string itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    public bool SignIn(string password)
    {
        string foundUserHash = "hash from database (saved password of a user)";

        string hash = Crypt(password, foundUserHash);

        return foundUserHash == hash;
    }

    private string Crypt(string password, string setting)
    {


        string output = "*0";

        if (setting.Substring(0, 2) == output)
            output = "*1";

        string id = setting.Substring(0, 3);

        if (id != "$P$" && id != "$H$")
            return output;

        int count_log2 = itoa64.IndexOf(setting[3]);

        if (count_log2 < 7 || count_log2 > 30)
            return output;

        var count = 1 << count_log2;

        string salt = setting.Substring(4, 8);

        if (salt.Length != 8)
            return output;

        var hash = GetHash(
            GetByteArraysAppended(
                Encoding.UTF7.GetBytes(salt),
                Encoding.UTF7.GetBytes(password)
                ));
        
        do
        {
            hash = GetHash(
                GetByteArraysAppended(
                    hash, 
                    Encoding.UTF7.GetBytes(password)
                    ));
        }
        while (--count!=0);

        output = setting.Substring(0, 12);

        output += encode64(hash, 16);

        return output;
    }

    private string encode64(byte [] input, int count)
    {
        string output = "";
        int i = 0;

        do
        {
            Int32 value = input[i++];
            output += itoa64[value & 0x3f];

            if (i < count)
                value |= input[i] << 8;
            output += itoa64[(value >> 6) & 0x3f];
            if (i++ >= count)
                break;
            if (i < count)
                value |= input[i] << 16;
            output += itoa64[(value >> 12) & 0x3f];
            if (i++ >= count)
                break;
            output += itoa64[(value >> 18) & 0x3f];
        } while (i < count);

        return output;
    }



    private byte[] GetByteArraysAppended(byte[] partOne, byte[] partTwo)
    {
        var parts = partOne.ToList();
        parts.AddRange(partTwo);
        var result = parts.ToArray();

        return result;
    }

    private byte[] GetHash(byte [] bytesToHash)
    {
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        var hash = md5.ComputeHash(bytesToHash);

        return hash;
    }

Der alte Code oben ist derselbe, den ich erneut versucht habe: /

1382350cookie-checkmd5 (wordpress) Passwortverschlüsselung in C#

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy