【问题标题】:Why does a hash value change while hashing from different file formats? [closed]为什么散列值在从不同文件格式散列时会发生变化? [关闭]
【发布时间】:2019-12-23 00:33:31
【问题描述】:

我观察到,当我从 *.txt 文件和 *.docx 文件中散列数据时,即使两个文件中的数据相同,生成的两个散列也不同。 为什么会这样?

【问题讨论】:

  • 这两种情况下使用的字符编码是什么?
  • 你怎么知道它是一样的?我在一个 txt 文件和一个 docx 中写了 hello 这个词。文本文件为 1kb,docx 为 12kb,因此在内容相同的情况下,docx 可能会保存更多与文档及其格式相关的数据。
  • 您错了:“两个文件中的数据相同”。打开它们看起来相似但它们不一样!无论如何,散列适用于文件数据(字节)而不是“内容”。

标签: python hash cryptography digital-signature sha256


【解决方案1】:

您只能以字节块的形式散列值的表示形式。因此,即使您将完全相同的值表示为两个不同的字节块,它们也不会具有相同的哈希值。如果您需要它们相同,则必须将获取值的表示形式转换为规范表示形式。

只要表示中的某些信息与值无关,您就会遇到此问题。例如,这两个字符串肯定会有不同的哈希值:

{ "id" : 1, "value" : "moo" }

和:

{ "value" : "moo", "id" : 1 }

但是,在 JSON 中,它们表示完全相同的值。如果它们不对 JSON 对象进行编码,那么它们以不同的方式散列将是至关重要的。如果它们确实对 JSON 进行编码,那么它们的哈希值必须相同。但是,当然,散列算法不知道它所散列的东西是否编码 JSON。所以这不可能是哈希算法的责任。

您需要代码来确保相同值的两个不同表示向哈希算法呈现相同的表示。这是你的责任——散列算法不可能做到。

【讨论】:

    【解决方案2】:

    加密哈希函数在某种意义上是随机但确定性的函数。确定性意味着相同的值将产生相同的哈希值。它们是随机的,因为散列的值是不可预测的。

    您的 txt 和 docx 文件虽然具有相同的文本,但在二进制文件中它们会有所不同。您可以将它们与diff 命令进行比较,看看有什么不同。此外,您可以看到它们将具有不同的文件大小。

    只要你不是很幸运,我们不希望你发现两个不同输入具有相同值的冲突。

    【讨论】:

    • 很确定哈希函数不涉及“随机性”!不可预测是一个更好的术语,也许坚持下去?
    • @SamMason Random 在第二句中解释。 They are random in the sense that the value of the hash is unpredictable.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2015-07-23
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多