我正在从文件(xls、csv、xml)中导入一些数据,这将导致一个复杂的内存对象图。现在我需要知道这张图是否在被导出后被修改过。什么是检查这个的安全方法?我想我会用文件导出哈希码?如果是这样,生成对象哈希码的标准方法就足够了吗?我应该如何生成哈希?我宁愿在对象图上而不是在实际的流/文件上生成散列。
3 回答
您可以通过加密或使用哈希码来确保没有人更改您的数据。如果您提到基于文本的格式,您会失去人类可读性,所以我认为您更喜欢哈希码。
是否可以应用标准哈希方法在很大程度上取决于您认为“安全”的确切内容:如果您只是想确保在存储/传输数据时没有硬件错误,或者如果您想检测某人的简单变化不知道他在做什么,那可能没问题 - 如果你确定你使用的是一个好的 GetHashCode() 函数。如果您想保护数据免受“攻击者”的侵害,我不会依赖 32 位“自制”哈希。(特别是如果“攻击者”可能知道代码,例如在开源项目中)。
在这种情况下,我更喜欢更强大的哈希函数,如 MD5 (不是很安全)或更好的 SHA-2。这些适用于字节流,您必须对数据(XML 等)本身或 .net 序列化数据(这使得哈希独立于文件的数据格式)进行哈希处理。.net 为这些算法提供类,例如参见http://msdn.microsoft.com/de-de/library/system.security.cryptography.hmacsha256.aspx
您的问题的标准解决方案不是散列图表。通常,您只需跟踪是否/何时发生更改。
你可以使用HasChanged
旗帜,但我不喜欢那样。我通常使用版本计数器,每次更改都会递增。然后,当保存到文件时,我存储版本计数器的当前值,并检查是否发生了变化,我将旧版本计数器与当前版本计数器进行比较。
我最终做了以下事情(看起来效果很好):
- 使用此算法创建一个包含单个对象的所有简单属性的自定义整数哈希码。
- 重复 1. 对于该对象引用的所有复杂对象
- 以众所周知的顺序将所有整数哈希码序列化为一个二进制流
- 创建此流的 MD5 校验和