2012-01-17 124 views
3

这里有两个哈希生成:散列非ASCII字符C#

  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#代码:)

+0

您是否尝试过使用UTF-8? –

+0

如此将“Encoding.Default.GetBytes”更改为“Encoding.UTF8.GetBytes”? – Alex

+0

我不认为这是错误的,因为AutoIt代码得到正确的散列。那么它有什么不同? – Alex

回答

6

它归结到编码您使用打开stringbyte[](因此我的建议,使用尝试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。

+0

非常感谢!这很有帮助。我会尝试一旦我回家:)我想给你+1,但我不能:( – Alex

+0

亚历克斯的代表。我确认该网站2是UTF 8和网站1是显然是西欧... –

+0

编码有时会造成如此大的麻烦... – Alex

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(); 
    } 
} 
+0

谢谢!对我很有用。 – Alex

+1

+1为IDisposable和用于修复OP的验证检查 –