散列非ascii字符C#

时间:2012-01-17 09:42:14

标签: c# md5

这是两个哈希生成器:

  1. http://www.md5hashgenerator.com/index.php
  2. http://www.miraclesalad.com/webtools/md5.php
  3. 现在,我的问题是: 为什么在尝试散列字符时哈希会有所不同。 (0x80的)? 我认为这是因为'€'不是普通的ASCII字符。 两个哈希中的哪一个是正确的?

    我试图用C#计算哈希生成器1返回的哈希值。 这个散列函数不会返回它。

    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 个答案:

答案 0 :(得分:6)

归结为您使用哪种编码将string转换为byte[](因此我建议使用尝试UTF-8,因为这是一个非常常见的选择;但是,任何完整的只要您知道使用哪个,unicode编码就可以工作);例如,基于字符串"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。

答案 1 :(得分:3)

您显示的两个MD5页面都将MD5描述为可以处理字符串的操作。它不是 - 它是一个适用于字节序列的操作。要从字符串转换为字节序列,您需要使用编码

您选择的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();
    }
}