Почему мой хэш MD5, рассчитанный по .net, эквивалентен хешу, рассчитанному на веб-сайте? - PullRequest
5 голосов
/ 10 октября 2008

Я пытаюсь сгенерировать эквивалентные MD5-хэши как в JavaScript, так и в .Net. Не сделав ни одного, я решил использовать против стороннего расчета - это веб-сайт для слова «пароль». Позже я добавлю соли, но в данный момент я не могу получить версию .net, совпадающую с хешем веб-сайта:

5f4dcc3b5aa765d61d8327deb882cf99

Я предполагаю, что это проблема кодирования, но я попробовал около 8 различных вариантов методов вычисления хеша MD5 в .Net, и ни один из них не соответствует тому, что я получил в JavaScript (или с веб-сайта). ). Этот пример MSDN является одним из методов, которые я попробовал, и в результате получается хеш, который я обычно получаю:

7c6a180b36896a0a8c02787eeafb0e4c

Редактировать: К сожалению, я случайно предоставил разные исходные строки для двух разных реализаций. EBSAK. : - / Тем не менее будет интересно услышать ваш ответ о последующей деятельности.

Дополнительный вопрос: в какой кодировке / формате лучше всего хранить хеш-значения в базе данных?

Ответы [ 6 ]

9 голосов
/ 10 октября 2008

Запуск кода с сайта MSDN, который вы цитируете:

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

возвращается:

5f4dcc3b5aa765d61d8327deb882cf99
4 голосов
/ 30 августа 2011

Это происходит потому, что каким-то образом вы хэшируете password1 вместо password или, возможно, неправильно вычисляете password, и это каким-то таинственным образом равно password1.

Вы можете выполнить обратный поиск хеша md5, который вы предоставили путем googling

7c6a180b36896a0a8c02787eeafb0e4c
0 голосов
/ 02 марта 2010

Следует также отметить, что суммы MD5 можно взломать с помощью радужных таблиц (в интернете есть бесплатные программы, которые принимают сумму MD5 в качестве входных данных и выводят открытый текст - обычно это пароль)

SHA1, вероятно, лучший выбор ...

РЕДАКТИРОВАТЬ: добавление соли является хорошим способом предотвращения обращения вашего хеша
РЕДАКТИРОВАТЬ 2: если бы я потрудился прочитать ваше сообщение, я бы заметил, что вы уже упоминали, что вы планируете добавить соль

0 голосов
/ 10 октября 2008

У вас есть какой-нибудь код, как вы пытаетесь это сделать?

(ответ на второй вопрос) Обычно я использую строковое поле и сохраняю его как кодировку BASE64. Достаточно легко работать и сравнивать.

/// <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 голосов
/ 10 октября 2008

Эта версия VB.Net дает те же результаты, что и MySQL из моего собственного опыта:

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 голосов
/ 10 октября 2008

Я получаю то же значение, что и этот веб-сайт для слова "пароль":

$ echo -n password | md5
5f4dcc3b5aa765d61d8327deb882cf99

Не видя код, который вы на самом деле используете, трудно понять, что может быть не так.

Что касается хранения хэшей в базе данных, я храню их в виде шестнадцатеричной строки. Хотя большинство баз данных могут обрабатывать двоичные двоичные объекты, их хранение в двоичном виде экономит только половину пространства, и их сложнее запрашивать и манипулировать. Скорее всего, другие данные, которые вы храните вместе с хэшем, все равно больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...