2015-05-21 129 views
0

我在嘗試計算XML文件的哈希MSD5時遇到了麻煩。 我有一個第三方驗證器,它正確計算它,我想在c#中使自己的驗證程序,但它不工作,我不斷得到一個無效的散列MD5與大XML文件,小文件工作正常。大文件有大約63000行。創建XML文件的哈希MD5

在C#代碼:

public string GenerateHash(string xml, string hashOrigin = null) 
    { 

     XDocument doc = XDocument.Parse(xml); 

     StringBuilder sb = new StringBuilder(); 

     string pKeyEncode = doc.Root.Value; 
     if (!string.IsNullOrEmpty(hashOrigin)) 
      pKeyEncode = pKeyEncode.Replace(hashOrigin, ""); 

     MD5CryptoServiceProvider _cs = new MD5CryptoServiceProvider(); 
     byte[] _bs = Encoding.GetEncoding("ISO-8859-1").GetBytes(pKeyEncode); 
     _bs = _cs.ComputeHash(_bs); 
     StringBuilder _s = new System.Text.StringBuilder(); 
     foreach (byte _b in _bs) 
     { 
      _s.Append(_b.ToString("x2").ToLower()); 
     } 
     int a = _s.GetHashCode(); 
     return _s.ToString(); 
    } 
+2

那麼,有什麼問題? –

+1

將您正在輸入的字節分離爲'ComputeHash',並將它們與您在Delphi程序中所做的對比。我們無法爲您調試。 –

+0

C#的哈希值與驗證器不同,當我嘗試更小的文件時,它工作正常,沒有大文件。 – fzuid

回答

0

首先,我會跟你不應該試圖實現自己的安全方法,除非你知道自己在做什麼的聲明前言本。即使是最小的錯誤也會造成安全漏洞,使您的功能變得毫無價值。話雖如此,微軟已將MD5功能構建到System.Security中。這裏是一個更簡單的方法來做到MD5:

var xmlBytes = new UnicodeEncoding().GetBytes(xmlAsString); 
var hashedXmlBytes = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(xmlBytes); 
var hashedString = BitConverter.ToString(hashedXmlbytes); 

我不推薦使用MD5,現在已經有一段時間了計算不安全。如果這是學術,那麼你可能沒問題。否則,在最低限度內,我會建議使用上述代碼與「SHA512」並首先進行鹽析。目前推薦的算法實際上是bcrypt或PBKDF2。它們連續運行一段時間(您設置的時間),這意味着您可以強制哈希花費一定的時間。這意味着人們強制或創建預先計算的表格(彩虹表格)將不得不等待一定的處罰時間來計算每個值,從而大大提高安全性。使用SHA512,您可以增加可用於暴力破解的解決方案數量,並使預計算表需要大量存儲空間,但計算速度仍然很快,並且存儲被視爲「便宜」。

+0

沒有工作,只是讀一些關於字符串生成器的最大大小... https://msdn.microsoft.com/en-us/library/system.text.stringbuilder.maxcapacity%28v=vs.110%29。 aspx – fzuid

+0

巴西政府規定散列必須是MD5 ......不能改變。 – fzuid

+0

它必須在實際散列之前或之中,因爲在md5中存在截斷並且輸出將只有32個字符。從我讀過的默認最大容量與Int32相同,即2,147,483,647。每個字符都是8位,因此如果要序列化它以便使用,則您的xml需要少於268,435,455個字符。它不應該有最大尺寸的問題,否則。 – Bob

-1

如果你想要一個MD5哈希,你可以簡單地做到這一點,但它看起來像有一些其他的東西與你想什麼事情。例如,您調用.GetHashCode()並考慮MD5哈希,但.GetHashCode()不是MD5哈希。

如果您使用.GetHashCode(),你可能也切斷所有的MD5的東西了,只是這樣做:

public string GenerateHash(string xml) 
{ 
    return xml.GetHashCode().ToString(); 
} 

然而,.GetHashCode()是.NET專用的,所以它止跌德爾菲計劃不會轉化爲同等價值。

否則,對於真正的MD5哈希,你可以做這樣的事情。 http://blogs.msdn.com/b/csharpfaq/archive/2006/10/09/how-do-i-calculate-a-md5-hash-from-a-string_3f00_.aspx

public string GenerateHash(string xml) 
{ 
    //you can potentially do something to standardize the format of the XML here. 

    // step 1, calculate MD5 hash from input 
    MD5 md5 = System.Security.Cryptography.MD5.Create(); 
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(xml); 
    byte[] hash = md5.ComputeHash(inputBytes); 

    // step 2, convert byte array to hex string 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < hash.Length; i++) 
    { 
     sb.Append(hash[i].ToString("X2")); 
    } 
    return sb.ToString(); 
} 

編輯:

從刷卡還有一個1行版本(若有人在未來的好奇)。

FormsAuthentication.HashPasswordForStoringInConfigFile(string, "MD5"), 
+0

我以前試過這個函數,它一直返回錯誤的散列。 – fzuid

+0

我開始認爲這是語言的限制也許... – fzuid

+0

修改爲將輸入更改爲xml –