Хеширование не ascii символов C # - PullRequest
3 голосов
/ 17 января 2012

Вот два генератора хеша:

  1. http://www.md5hashgenerator.com/index.php
  2. http://www.miraclesalad.com/webtools/md5.php

Теперь мой вопрос: Почему хэши различаются при попытке хэширования символа '€' (0x80)? Я предполагаю, что это происходит потому, что '€' не является нормальным символом ASCII. Какой из двух хешей является «правильным»?

Я пытаюсь вычислить хеш, возвращаемый генератором хеша 1 с помощью C #. Эта функция хеширования не возвращает.

private string GetMD5Hash(string TextToHash)
{
        if ((TextToHash == null) || (TextToHash.Length == 0))
        {
            return string.Empty;
        }
        MD5 md5 = new MD5CryptoServiceProvider();
        byte[] textToHash = Encoding.Default.GetBytes(TextToHash);
        byte[] result = md5.ComputeHash(textToHash);
        return BitConverter.ToString(result).Replace("-", "").ToLower();
}

Как я могу изменить его, чтобы он возвращал хеш, который я хочу?


Дополнительная информация: Я сделал небольшой скрипт AutoIt:

#include  <Crypt.au3>
ConsoleWrite(StringLower(StringMid(_Crypt_HashData(Chr(128), $CALG_MD5),3)) & @CRLF)

и возвращает хеш, который я хочу! Однако мне нужен код C #:)

Ответы [ 2 ]

6 голосов
/ 17 января 2012

Все зависит от того, какую кодировку вы используете, чтобы превратить string в byte[] (поэтому я предлагаю использовать попробовать UTF-8, так как это довольно распространенный выбор здесь; однако любая полная кодировка Юникода будет работать до тех пор, пока вы знаете, что использовать); например, на основе строки "abc€" мы можем сделать вывод, что первый сайт может использовать любой из:

874: Thai (Windows)
936: Chinese Simplified (GB2312)
1250: Central European (Windows)
1252: Western European (Windows)
1253: Greek (Windows)
1254: Turkish (Windows)
1255: Hebrew (Windows)
1256: Arabic (Windows)
1257: Baltic (Windows)
1258: Vietnamese (Windows)
50227: Chinese Simplified (ISO-2022)
51936: Chinese Simplified (EUC)
52936: Chinese Simplified (HZ)

Лично я бы использовал UTF-8!

Вот код, который я использовал для поиска подходящих кодировок:

    MD5 md5 = new MD5CryptoServiceProvider();
    foreach (var enc in Encoding.GetEncodings())
    {
        byte[] textToHash = enc.GetEncoding().GetBytes("abc€");
        byte[] result = md5.ComputeHash(textToHash);
        var output = BitConverter.ToString(result).Replace("-", "").ToLower();
        if(output == "7a66042043b2cc38ba16a13c596d740e")
        {  // result from http://www.md5hashgenerator.com/index.php
            Console.WriteLine(enc.CodePage + ": " + enc.DisplayName);
        }
    }

Далее, тестирование со строкой "dnos ʇǝqɐɥdʃɐ" показывает, что второй сайт определенно использует UTF-8; первый сайт не находит совпадений, поэтому я предполагаю, что он использует кодировку на основе кодовой страницы, и вкратце не будет работать надежно с полным диапазоном Unicode.

3 голосов
/ 17 января 2012

Обе страницы MD5, которые вы показали, описывают MD5 как операцию, которая работает со строками.Это не - это операция, которая работает с последовательностями byte .Чтобы преобразовать строку в последовательность байтов, вам нужно использовать кодировку .

Вы выбрали Encoding.Default, что почти всегда является плохим выбором - я бы, как правило,выберите Encoding.UTF8.Однако, что важно, ни один из этих сайтов не говорит, что они используют.Однако в реальной жизни я бы надеялся , что вы либо будете иметь контроль над обоими процессами хеширования (при условии, что их действительно два), либо что любой код хэширования, который вы не контролируете, будет указывать, какую кодировку использовать.

Обратите внимание, что существует более простой способ создания экземпляра MD5 - просто используйте MD5.Create.Вы также должны обычно помещать его в оператор using, поскольку он реализует IDisposable:

private static string GetMD5Hash(string text)
{
    if (string.IsNullOrEmpty(text))
    {
        return "";
    }
    using (var md5 = MD5.Create())
    {
        byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(text));
        return BitConverter.ToString(hash).Replace("-", "").ToLower();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...