2011-04-27 98 views
10

我有三個字段:string Title,byte[] Bodybyte[] Data,我想從中計算一個散列作爲檢查以確保它們沒有被篡改或損壞。用C#將多個字節[]一起散列成單個散列?

在Python中,我可以連續幾次使用md5.update()來執行此操作。但我無法在C#中找到類似的功能。要使用MD5.ComputeHash()我需要將我所有的源複製到一個字節[]中,這是我想避免的一個步驟。

如何將它全部散列到一個散列而不必將數據複製到臨時緩衝區中?

+1

爲什麼不使用臨時變量? – 2011-04-27 13:44:57

+1

順便說一句,我猜python會在引擎蓋下創建一個單字節數組... – digEmAll 2011-04-27 13:51:40

+4

你知道MD5壞了嗎?你說你使用散列檢測篡改,但攻擊者在不改變散列的情況下篡改文檔在計算上是可行的。您應該使用SHA256或其他一些沒有已知碰撞阻力問題的散列算法。 – 2011-04-27 14:21:53

回答

13

幾乎所有的哈希算法的設計方式都是可以連續將數據輸入到多個塊中。結果就像整個數據一次散列一樣。

創建一個例如MD5CryptoServiceProvider並調用TransformBlock Method每個塊和TransformFinalBlock Method最後塊:

MD5 md5 = new MD5CryptoServiceProvider(); 

// For each block: 
md5.TransformBlock(block, 0, block.Length, block, 0); 

// For last block: 
md5.TransformFinalBlock(block, 0, block.Length); 

// Get the hash code 
byte[] hash = md5.Hash; 
+0

似乎混合了各種語言? – 2011-04-27 13:54:21

+0

你能提供一個代碼示例嗎?我看到了這種方法,但它的使用無法避免。例如,我如何避免覆蓋之前的輸出? – 2011-04-27 13:57:48

+0

變換(最終)塊本質上與更新的方式相同,即它使用新數據更新MD5實例的內部狀態。我已經添加了一個例子(雖然未經測試)。 – dtb 2011-04-27 14:04:55

-1

您必須將它們全部合併到一個變量中,然後計算MD5哈希值。我沒有看到任何捷徑。

你看,這裏大多數提出的解決方案只是嘗試要麼在同一直線上(「一個襯墊」)運行多個命令或實現的東西「引擎蓋下」相結合的領域,然後哈希...

1

使用普通的.NET,我不認爲有更新和MD5哈希的方法。但是,Windows在crypt.dll中定義了一個MD5Update函數。你可以使用Interop來利用這個我想。

否則,有一個PHP相當於.NET C#的實現,這裏位於SO:Problem porting PHP crypt() function to C#

PS:我肯定會去的聯合臨時變量的解決方案:-)

+0

...歡迎downvoters解釋他們的觀點。 – 2011-04-27 14:54:25

0

可以在Hash值上創建一個Hash。

MD5 md5 = System.Security.Cryptography.MD5.Create(); 
byte[] totalHash= md5.ComputeHash(md5.ComputeHash(part1).Concat(md5t.computeHash(part2))); 

不創建字節數組的副本,但散列連接的散列。

+0

+1:不知道爲什麼你得到了-1'd,這是一個合理的解決方案國際海事組織(儘管@ dtb的更好:))。 – 2011-04-27 14:23:25

+0

只是問自己爲什麼我得到了-1。但我同意dtb是更好的:-) – fixagon 2011-04-27 14:27:17

+1

這減少了加密強度(在一個已經被削弱的MD5上),潛在的顯着是要避免的。 (不是我-1,但我會認爲這是原因)。我不相信它跟Guffa的建議差不多,但用這種方式推出自己的加密並不是一個好主意(即使積木很好) – ShuggyCoUk 2011-04-27 14:42:02

0

調用三個不同值ComputeHash功能將創建三個不同的字節數組的結果。那些結果必須以某種方式組合才能產生一個散列。沒有辦法解決這個事實。它會在堆中創建三個新對象。它將計算三次哈希(相當慢的操作),而不是一次。

我認爲做你想做的事情的最高性能的方法是繼續前進,並將你的源值複製到單個字節數組中,並將其作爲散列值。

你不說你爲什麼要避免這種方法。我認爲它在簡單性和可維護性方面獲勝。這是自我記錄,明顯的方法。這是最高效的方法。我真的沒有看到一個缺點。

相關問題