Как реализовать Apache Shiro MD5Hash в C # - PullRequest
0 голосов
/ 09 октября 2019

Что эквивалентно C # коду следующего Java-кода:

import org.apache.shiro.crypto.hash.Md5Hash;
public static String enPwd(String username, String pwd) { return (new Md5Hash(username + pwd, username, 2)).toHex().toString(); }

Я хочу знать, как получить такой же результат хеширования в C #.

1 Ответ

0 голосов
/ 09 октября 2019

Насколько я могу судить по чтению кода Java здесь и здесь , разница в том, что он выполняет несколько итераций алгоритма MD5.

Принимая этот ответ и изменив его, я достиг этого:

public static string CreateMD5(string input, string salt = null, int iterations = 1)
{
    // Use input string to calculate MD5 hash
    using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
    {
        byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);

        // modification from linked answer: prefix with salt
        if (!string.IsNullOrEmpty(salt) != null)
        {
            inputBytes = System.Text.Encoding.ASCII.GetBytes(salt).Concat(inputBytes).ToArray();
        }


        byte[] hashBytes = md5.ComputeHash(inputBytes);



        // modification from linked answer: iterate N times
        for (int i = 1; i < iterations; ++i)
        {
            hashBytes = md5.ComputeHash(hashBytes);
        }




        // Convert the byte array to hexadecimal string
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hashBytes.Length; i++)
        {
            sb.Append(hashBytes[i].ToString("X2"));
        }
        return sb.ToString();
    }
}

public static string enPwd(string username, string pwd)
{
    return CreateMD5(username + pwd, username, 2);
}

Как видите, вам просто нужно хэшировать полученный хеш.

У меня естьреплицировал то, что я видел в библиотеке Java здесь , и код C # выдает тот же результат здесь .

...