![是否可以恶意更改文件但保留其原始 SHA-1 哈希值?](https://linux22.com/image/1443990/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E6%81%B6%E6%84%8F%E6%9B%B4%E6%94%B9%E6%96%87%E4%BB%B6%E4%BD%86%E4%BF%9D%E7%95%99%E5%85%B6%E5%8E%9F%E5%A7%8B%20SHA-1%20%E5%93%88%E5%B8%8C%E5%80%BC%EF%BC%9F.png)
根据这文章和许多其他文章都指出,SHA-1 并不安全。
就我而言,我并不关心密码或数字证书。我关心的是文件完整性。
文件(例如 ISO 映像或可执行文件)是否可能被恶意更改,以达到以下目的:
- 保留原始文件的 SHA-1 哈希值,并且
- 维护文件的整体内容和操作(但当然现在包括原来不存在的恶意内容)
在我看来,以产生 SHA-1 冲突的方式更改文件将使该文件完全无用。 ISO 将完全损坏,或者可执行文件将变得非常混乱,甚至不再是可执行文件。
但是,我的看法很可能是错误的。到目前为止,我在 Google 搜索中没有找到任何关于 SHA-1 是否继续适用于文件验证的信息。有什么见解吗?
答案1
至今还没有人为 SHA-1 实现这一点。理论上是可能的,但仍然不切实际。关于 SHA-1 不安全的报告只是意味着安全级别没有我们想象的那么高,这意味着我们不必像我们想象的那样在很多年内再担心这个问题。
生成与给定文件具有相同 SHA-1 哈希的文件比自己制作两个具有相同 SHA-1 哈希的文件更困难。据我们所知,世界上还没有人完成过哪怕是这个简单的任务。但这并不意味着明天就不可能。
答案2
从理论上来说这是可能的,但目前尚未实现。
您要查找的是“哈希冲突”:两个文件具有相同的哈希值。SHA-1 等加密哈希码通常旨在使这种情况变得困难。由于 SHA-1 是 160 位代码,因此平均需要 2^159 次强力尝试才能找到重复项。如果找到一种算法,其可靠程度优于加密哈希,则认为该哈希“已破解”。
MD-5 是一个非常不可靠的哈希值的例子。它本来应该有 128 位的强度,平均需要 2^127 次尝试。事实上,利用已知漏洞,实际需要的尝试次数可能低至 2^47。这比 2^127 小很多。事实上,在现代计算集群上,不到一天就可以完成。
我之所以举这个例子,是因为这最接近于你希望使用 SHA-1 的方式。然而,这并不是密码分析用来确保哈希不被破解的最常用方法。它们通常允许攻击者选择两个文件之间的碰撞,而不是让你选择一个文件,然后攻击者试图匹配它。这种攻击的优点是更容易进行基准测试。如果我发现破解你的文件“很难”,这是否意味着另一个文件同样强大?这种攻击者可以选择两个文件的攻击确保我们能抓住最坏的情况。
这种攻击允许一种有趣的技巧,称为“生日攻击”长话短说,使用生日攻击会使算法的强度减半,因此 SHA-1 需要 2^80 次尝试(平均),而 MD5 需要 2^64 次尝试(平均)。这分别是 160 和 128 的一半。
SHA-1 已知有攻击会将其强度从 2^80 降低到 2^69。这对你来说没什么大不了的。2^69 次尝试是长的时间。
然而,从历史来看,我们发现哈希算法并不是自发破解的,而是随着时间的推移而破解的。没有人能破解像 MD-5 这样的算法,一夜之间将其从 2^64 变成 2^47。随着时间的推移,这种情况会发生,因为许多人发表了关于他们用来对付它的数学的论文。人们通常可以看到攻击的复杂性从算法开始慢慢下降(其中最好的攻击通常是生日攻击)。
事实上,我们看到碰撞发生了一些变化,这表明 SHA-1 看到了隧道尽头的曙光。它仍然很强大,但人们可能希望升级到目前更安全的最新 SHA-3。
您确实应该从威胁模型的角度做出这样的决定。如果攻击者遇到其中一次碰撞,他们能造成多大的损害。您的攻击者是可以访问几台笔记本电脑的脚本小子,还是拥有整个超级计算集群的政府。攻击者在哈希无用之前需要多长的时间窗口来破解哈希(加密的许多用途都涉及“换岗”,例如密码轮换)。所有这些都会影响您对碰撞的重视程度。
答案3
这篇文章中讨论的 SHA-1 中的缺陷非常具体:它们允许攻击者创建两个哈希值为相同值的东西(这称为“碰撞攻击”)。然而,碰撞攻击需要攻击者控制两个都所涉及的文件。如果攻击者不控制原始文件,碰撞攻击不会让他们找到具有相同哈希值的另一个文件。
这对 TLS/SSL(以及一般的签名)很重要,因为攻击者通常可以利用这些签名能控制两个文件。TLS 证书主要是由请求者创建的(他们无法控制的部分通常是可预测的),因此冲突允许他们制作合法证书和非法证书,对合法证书进行签名,然后传输签名。
对于文件,情况并不总是相同的。如果您担心制作文件的人是攻击者(例如,他们会得到一个独立验证为好的东西,然后向您发送具有相同哈希值的恶意有效载荷),则 SHA-1 攻击适用,您应该考虑逐步淘汰它(尽管目前还不重要,正如 David Schwartz 提到的)。如果原始文件是可信的,那么攻击者就无法应用当前已知的 SHA-1 攻击,尽管您仍然应该考虑在可以的情况下逐步淘汰它(如果可以选择,请使用没有已知攻击的哈希,如 SHA-2)。
回应“碰撞不会有用”——虽然攻击不需要攻击者能够获得有用碰撞,将“碰撞”变成“有用的碰撞”通常并不难。许多文件格式都有相当大的空间,您可以在其中放置任何您想要的东西而不会影响文件的功能;攻击者通常可以修改它以获得碰撞(如果碰撞实际上是可以找到的),同时将功能部分保持为他们想要的样子。“学术攻击”和“实际攻击”之间的差距可能很大;“任何碰撞”和“有用的碰撞”之间的差距通常要小得多。
更严重的问题与算法选择无关,而是您如何获取哈希值。哈希所做的只是将问题从“获取真实文件”转移到“获取真实哈希值”;从与文件相同的服务器和通过相同连接类型发送的哈希值对于恶意修改毫无用处(任何可以篡改文件的攻击者都可以篡改哈希值)。只有当您对哈希的信任程度超过对文件的信任程度时,哈希才有用;虽然有时确实如此(种子、镜像),但它们经常在情况并非如此时使用。因此,无论何时使用哈希进行完整性验证,您都应该非常小心。
答案4
这一般的问题中引用的文章的要点是:SHA1 已被弃用,应在仍有时间顺利完成时逐步淘汰。在某些领域,时间已经不多了,因为 Google 和 Microsoft 强制执行最后期限。
经验法则已弃用技术:
- 如果您进行新设计或添加功能,请不要使用它(SHA1)。
- 如果您要维护某些旧的东西,请制定计划何时替换它(SHA1)。
摘自 Bruce Schneier 2012 年博客文章: “关键在于我们社区现在需要开始从 SHA-1 迁移到 SHA-2/SHA-3。”