为对象图生成安全的哈希码

时间:2011-03-15 06:02:26

标签: .net serialization hashcode crc

我正在从文件(xls,csv,xml)导入一些数据,这将导致复杂的内存中对象图。现在我需要知道这个图是否已被修改,因为它曾经被导出过。什么是安全的检查方法?我想我会用文件导出哈希码?如果是这样the standard way of generating an object's hashcode就足够了?我该如何生成哈希?我更喜欢在对象图上而不是在实际的流/文件上生成哈希。

3 个答案:

答案 0 :(得分:2)

您可以通过加密或使用哈希码来确保没有人更改您的数据。如果你提到的基于文本的格式你将失去人类可读性,所以我认为你更喜欢哈希码。

如果可以严格应用标准哈希方法取决于您认为“安全”的确切原因:如果您只是想确保在存储/传输数据时没有硬件错误,或者如果您想要检测到简单的更改如果你确定你使用了一个好的GetHashCode()函数,那个不知道他在做什么的人可能没问题。如果你想保护数据免受“攻击者”的攻击,我不会依赖32位“自制”哈希。 (特别是如果“攻击者”可能知道代码,例如在开源项目中)。

在这种情况下,我更喜欢更强大的哈希函数,如MD5(不是非常可碰撞安全)或更好SHA-2。这些工作在字节流上,你必须散列数据(XML等)本身或者.net-serialized数据(这使得散列独立于文件的数据格式)。 .net提供了这些算法的类,例如参见http://msdn.microsoft.com/de-de/library/system.security.cryptography.hmacsha256.aspx

答案 1 :(得分:0)

您的问题的标准解决方案不是散列图表。通常,您只需跟踪是否/何时发生更改。

您可以使用HasChanged标志,但我不喜欢这样。我通常使用一个版本计数器,它会在每次更改时递增。然后当保存到文件时,我存储版本计数器的当前值,并检查是否有更改,我将旧版本计数器与当前版本计数器进行比较。

答案 2 :(得分:0)

我最终做了以下事情(似乎工作得很好):

  1. 使用this algorithm创建一个自定义整数哈希码,其中包含单个对象的所有简单属性。
  2. 对于此对象引用的所有复杂对象
  3. 重复1.
  4. 以众所周知的顺序将所有整数哈希码序列化为一个二进制流
  5. 创建此流的MD5校验和