【问题标题】:Sha1 hash of multiple sha1-hashes -> Secure to identify file?多个 sha1-hashes 的 Sha1 哈希 -> 安全识别文件?
【发布时间】:2017-03-17 13:34:49
【问题描述】:

假设我在浏览器中将 1G 文件拆分为 1024 个 1Mb 块,获取每个块的 SHA1 并将此哈希临时保存。最后,在对所有块进行散列后,对所有先前收集的 SHA1 散列进行 SHA1(对散列进行散列)。然后将此“最终”哈希发送到我的服务器。

这个哈希值是否可以安全地识别我在服务器上的文件? (假设我们有一个安全的连接并且 sha1 没有冲突)

对多个散列进行散列是一个坏主意吗?

【问题讨论】:

  • 是的,但为什么呢?您是在防止具有相同哈希的伪造,还是只需要确定两个文件是否不同?对于第一种情况,SHA1 不足以满足当前的最佳实践,只需使用 SHA256 或 SHA-512。对于第二种情况,单个 SHA1 就足够了,但建议移至 SHA-256。

标签: cryptography sha1


【解决方案1】:

我猜你的目标是检查上传文件的完整性,比较完成后在客户端和服务器端计算的校验和。然后对每个块进行散列,组合它们并对结果进行散列处理就足够了。

//pseudocode
SHA1.digest ( 
    SHA1.digest(chunk 1) + SHA1.digest(chunk 2) + ... + SHA1.digest(chunk n))

但请注意,您可以对完整文件执行增量 SHA1 哈希,将每个块添加到计算中。这样的结果与一步哈希整个文件的结果是一样的,你不需要组合时间数据

    SHA1.update(chunk 1)
    SHA1.update(chunk 2)
    ...
    SHA1.update(chunk n)
    SHA1.digest ()

如 cmets 所示,也可以考虑移至 sha256,但可能为此目的 SHA1 就足够了

【讨论】:

  • 如何在浏览器中使用新的数据块更新 sha1?据我所知,任何现代浏览器中的 crypto.subtle 都没有更新方法。你有没有想过其他选择?
  • @MarcinPevik WebCryptoApi 中没有 update 方法。也许您可以使用替代的 javascript 库,例如 forge。见github.com/digitalbazaar/forge#sha1
【解决方案2】:

这应该可以。假设 SHA-1 是 collision free,对于两个不同的文件,至少有一个哈希值彼此不同。所以“最终”的哈希值也会有所不同。

一般来说,散列哈希不会提高安全性。如果您想要更高的安全性,请使用 SHA-256。

【讨论】:

  • 关于您的链接,如果您阅读它,您会发现需要大量的计算机能力:完成攻击第一阶段需要 6,500 年的 CPU 计算加上 110 年的 GPU 计算才能完成第二阶段。这是一个可行的攻击吗?不。这种攻击证明,对于普通用途来说,SHA1 确实是碰撞安全的。
  • 我已阅读此内容。 SHA1 理论上被破坏了几年,现在他们构造了一个碰撞。所以它坏了。时间成本对你我来说可能是个问题,但有些人拥有相当多的 CPU 和 GPU。因此,如果您需要安全性,则不应将 SHA1 用于任何新项目。如果您不关心安全性并且只想要内部使用的指纹,您可以使用 SHA1,因为您不会意外遇到碰撞。
  • SHA1 的使用取决于安全需要。对于身份验证,它被认为是损坏的,但对于 Git 使用的文件唯一性却没有。当然 SHA-256 通常是比 SHA1 更好的选择,但 SHA1 在许多用途中仍然有效。如果您要防御可能花费 6,500 CPU 年每个哈希的攻击者,那么您遇到的问题更大,应该更加关注rubber-hose cryptanalysis
  • 一般来说,“SHA-1 已损坏”是一个“chicken little”问题,如果我们等待足够长的时间,那只鸡可能是正确的。
  • 结束这一切:总结一下我的回答:是的,它有效,但如果您担心安全性,请使用 sha256,就像您的评论一样。您的观点仅与链接中显示的攻击有关。这种攻击只是证明有可能产生碰撞。它并不能证明它至少需要那么长时间。也许有人有更快的算法。
猜你喜欢
  • 2011-10-27
  • 2017-06-05
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2011-02-04
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多