如今,许多网站都提供 MD5 和 SHA256 哈希来检查下载文件或存档的完整性。
我想知道使用 SHA256 哈希进行完整性检查有多安全?
注意:将文件内容视为随机输入(无攻击)
注意:似乎是一个简单的问题(我在 wikipedia 上阅读了有关冲突的信息),但我还没有在这个网站上找到答案
如今,许多网站都提供 MD5 和 SHA256 哈希来检查下载文件或存档的完整性。
我想知道使用 SHA256 哈希进行完整性检查有多安全?
注意:将文件内容视为随机输入(无攻击)
注意:似乎是一个简单的问题(我在 wikipedia 上阅读了有关冲突的信息),但我还没有在这个网站上找到答案
关于碰撞攻击的能力似乎有些混乱。
如果哈希是抗碰撞的,这意味着攻击者将无法找到任何两个导致相同输出的输入。如果哈希是抗原像的,则意味着攻击者将无法找到具有特定输出的输入。MD5 很长一段时间以来一直很容易受到碰撞的影响,但它仍然具有抗原像性。
如果您相信最初对数据进行哈希处理以向您提供完整性检查的一方没有恶意,并且他们不允许任何人事先修改数据(数据的任何部分,即使 2 张图像、视频或 pdf看起来相同,它们可能有很大不同),那么 MD5 应该足以验证完整性,而 SHA-256 不应该提供更多的安全性(除非将来对 MD5 的原像抗性进行任何攻击)。
如果攻击者可能已经能够对数据进行任何修改(即使是看似良性的修改),那么 SHA-256 将更加安全,就像 MD5 一样,攻击者可能已经制作了具有相同哈希值的恶意文件。
在很多情况下,并非如此。如果您通过 HTTPS 从提供哈希值的同一网站下载文件,那么您已经受益于 MAC TLS 用于真实性检查,因此中间人将无法更改传输中的文件。如果有人能够恶意修改站点上的文件,他们也可以修改哈希。
验证文件的 MD5 或 SHA-256 散列确实有意义的一种情况是,如果您从镜像下载文件并根据原始受信任站点提供的散列检查散列。
我想知道使用 SHA256 哈希进行完整性检查有多安全?
注意:将文件内容视为随机输入(无攻击)
根据您对“无攻击”的说明,在我看来您是在问:
“文件的随机更改(例如,下载期间的位翻转)将导致创建一个与原始文件具有相同校验和的新/不同文件的概率是多少?”
对于MD5的情况,这个概率是:1/(2^128) = 2.94e-39 = 0.00000000000000000000000000000000000000294
对于 SHA256 的情况,这个概率是:1/(2^256) = 8.64e-78 = 0.0000000000000000000000000000000000000000000000000000000000000000000000000046
重要警告:在上述随机变化的假设情况下,MD5 和 SHA256 都是不错的选择。然而,在现实生活中,MD5 散列函数因为已经被破坏(已发现冲突)而受到反对。所以,现实生活中的建议是:使用 SHA256 而不是 MD5 来确保文件完整性。
根据评论更新:我将 MD5 称为“损坏”,意思是(基本上)已经发现了碰撞。MD5 的主要推测属性之一是“产生具有相同消息摘要的两条消息在计算上是不可行的......”(RFC 1321)因为可能违反此属性,所以我将 MD5 称为“已损坏”。这可能有点苛刻。我仍然看到 MD5 一直在使用,我自己也一直在使用它。在某些情况下使用 MD5 很好,尤其是在没有其他选择的情况下。
MD5 创建一个 128 位散列,而 SHA256 创建一个 256 位散列。
您可以说 SHA256 的安全性是 MD5 的“两倍”,但实际上随机冲突的可能性微乎其微。我会说 MD5 提供了足够的完整性保护。
存在故意创建 MD5 碰撞的攻击,但意外发现碰撞的机会仍然取决于哈希的大小,因此约为 2/2 128。
目前世界上没有两个不同的文件具有相同的 SHA256 哈希值。有不同的文件具有相同的 MD5 哈希值,但这仅仅是因为它们是故意如此创建的。
存在 MD5 冲突漏洞,有意生成 2 个具有相同 MD5 和的文件是可行的。
没有已知的 SHA256 冲突,除非算法中存在严重的弱点,否则极不可能找到。
为了验证文件没有意外损坏,MD5 可能就足够了。如果有可能是故意改变的,MD5 是不安全的,你应该坚持使用 SHA256。