2012-01-17 175 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的驗證檢查 –