2011-03-15 52 views
2

我從一個文件(xls,csv,xml)導入一些數據,這將導致一個複雜的內存中對象圖。現在我需要知道這個圖表是否自從它​​被導出後就被修改過了。什麼是安全的方法來檢查這個?我想我會輸出一個哈希碼與文件?如果那樣the standard way of generating an object's hashcode就夠了?我應該如何生成哈希?我寧願在對象圖上而不是在實際的流/文件上生成哈希。生成一個對象圖的安全哈希碼

回答

0

最後我做了以下(至極似乎工作得很好):

  1. 創建一個自定義的整數哈希代碼包括使用this algorithm單個對象的所有簡單屬性。
  2. 重複1.所有複雜的對象,這個對象在一個衆所周知的順序
  3. 創建此流的MD5校驗引用
  4. 連載所有的整數哈希碼成一個二進制流
2

您可以確保沒有人通過加密或使用散列碼來更改您的數據。如果您提到的基於文本的格式會丟失可讀性,所以我認爲您更喜歡使用hashcode。

如果標準哈希方法可以大量應用,取決於您認爲什麼是「安全」:如果您只是想確保在存儲/傳輸數據時沒有硬件錯誤,或者您想要檢測到簡單更改某個不知道自己在做什麼的人,如果你確定你使用了一個好的GetHashCode()函數,那可能會很好。如果你想保護數據免受「攻擊者」的攻擊,我不會依賴32位「自制」哈希。 (特別是如果「攻擊者」可能知道代碼,例如在開源項目中)。

在這種情況下,我更喜歡更強大的散列函數,如MD5(不是非常安全)或更好的SHA-2。這些工作對字節流你必須散列數據(XML等)本身或者.net序列化的數據(這使得散列獨立於文件的數據格式)。 .net爲這些算法提供了類,例如參見http://msdn.microsoft.com/de-de/library/system.security.cryptography.hmacsha256.aspx

+0

我只是簡單地想以快速可靠的方式檢測對實際數據的更改(用戶添加項目,更改屬性值等)。所以我想知道這是否足夠可靠:http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode – bitbonk 2011-03-15 13:54:45

+0

有一個捕獲所有2個問題 - 因爲任何人都可以更改數據,所以檢查'數據'是否相同的唯一方法是檢查每一個信息的每一位,或者計算雙方的散列並比較散列。而且,由於對可能發生變化的數據計算散列意味着您必須讀取所有數據,因此不直接比較數據的意義何在? – 2011-03-21 21:18:13

+0

因爲我沒有原始數據。一旦它被導出,它可以在本地刪除。當我稍後導入時,我仍然需要能夠判斷數據是否已更改。這就是爲什麼原始哈希將與導出的文件一起保存,然後我在稍後導入時可以用來驗證數據。 – bitbonk 2011-07-18 13:58:11

0

您問題的標準解決方案不是對圖形進行散列。通常你只是跟蹤發生變化的時間/時間。

您可以使用HasChanged標誌,但我不喜歡那樣。我通常使用版本計數器,每次更改都會增加。然後,當保存到文件時,我會存儲版本計數器的當前值,並檢查是否有更改,我將舊版本計數器與當前版本進行比較。

+0

我無法追蹤更改,因爲這些更改是在我的軟件之外完成的。數據被導出(csv,XML,excel),(可能)編輯,然後再次導入。 – bitbonk 2011-03-20 21:25:27