【问题标题】:generating an safe hashcode for an objectgraph为对象图生成安全哈希码
【发布时间】:2011-03-15 06:02:25
【问题描述】:

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

【问题讨论】:

    标签: .net serialization hashcode crc


    【解决方案1】:

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

    是否可以应用标准哈希方法在很大程度上取决于您认为“安全”的确切内容:如果您只是想确保在存储/传输数据时没有硬件错误,或者如果您想检测一个不知道他在做什么的人,那可能没问题 - 如果您确保您使用的是一个好的 GetHashCode() 函数。如果您想保护数据免受“攻击者”的侵害,我不会依赖 32 位“自制”哈希。 (特别是如果“攻击者”可能知道代码,例如在开源项目中)。

    在这种情况下,我更喜欢更强大的哈希函数,如 MD5(不是很安全)或更好的 SHA-2。这些适用于字节流,您必须对数据(XML 等)本身或 .net 序列化数据(这使得哈希独立于文件的数据格式)进行哈希处理。 .net 为这些算法提供类,例如参见 http://msdn.microsoft.com/de-de/library/system.security.cryptography.hmacsha256.aspx

    【讨论】:

    • 我只是想以一种快速可靠的方式检测实际数据的变化(用户添加了一个项目、更改了一个属性值等)。所以我想知道这是否足够可靠:stackoverflow.com/questions/263400/…
    • 您的 2 个问题都有一个问题 - 因为任何人都可以更改数据,所以检查“数据”是否相同的唯一方法是一次检查每一个信息,或计算双方的哈希值并比较哈希值。而且由于计算可能更改的数据的哈希意味着无论如何您都必须读取所有数据,所以不直接比较数据有什么意义?
    • 因为我没有原始数据。导出后可以在本地删除。当我稍后导入它时,我仍然需要能够判断数据是否已更改。这就是为什么原始哈希将与导出的文件一起保存,然后我稍后可以在导入时使用它来验证数据。
    【解决方案2】:

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

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

    【讨论】:

    • 我无法跟踪更改,因为这些更改是在我的软件之外进行的。数据被导出(csv、XML、excel),(可能)编辑,然后再次导入。
    【解决方案3】:

    我最终做了以下事情(看起来效果很好):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-29
      • 2018-04-02
      • 1970-01-01
      • 2020-01-04
      • 2013-11-17
      • 2019-11-30
      • 2018-05-16
      • 2014-12-31
      相关资源
      最近更新 更多