2011-03-15 29 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