是否可以通过维护原始SHA-1哈希的方式来恶意更改文件?


33

根据文章,和许多人一样,SHA-1是不安全的。

就我而言,我不关心密码或数字证书。我担心文件的完整性。

是否有可能通过以下方式恶意更改文件(例如,ISO映像或可执行文件):

  • 维护原始文件的SHA-1哈希,并且
  • 维护文件的整体内容和操作(但现在当然包括最初不存在的恶意内容)

我的看法是,以产生SHA-1冲突的方式更改文件会使文件完全无用。ISO将会完全损坏,或者可执行文件将被彻底搅乱,甚至不再是可执行文件。

但是,我的看法很可能是错误的。到目前为止,在SHA-1继续适合文件验证方面,我在Google搜索中没有发现任何问题。有什么见解吗?


7
答案是“取决于”。如果ISO恰好包含许多jpeg或电影文件-以及目标可执行文件,则有可能。您可以相当大地修改jpeg文件,而无需更改它们的大小或外观。最终,文件越大,您必须玩的越多,发生非破坏性碰撞的机会就越大。
Paul

7
正是@cpast,许多网站都列出SHA-1哈希值,以使您可以验证下载。考虑到这一点,黑客似乎很可能通过更改内容发布的哈希值来破坏网站。然后,您真的被搞砸了。
misha256

1
仅供参考,我的问题专门询问SHA-1,因为它很常见,尤其是从Microsoft / MSDN下载时。当然,一些网站发布的MD5哈希值,其他SHA256等
misha256

2
问题是,当存在替代品一样快,易于使用且广泛可用的替代品(例如SHA-256)时,为什么使用具有任何已知漏洞的哈希?此外,密码学家在发现仅一个漏洞后就宣布哈希不安全是有原因的:历史表明,一旦发现一个漏洞,其他人就会迅速追随。布鲁斯·施耐尔(Bruce Schneier)著名的名言是“攻击总是变得更好,他们永远不会变得更糟”
BlueRaja-Danny Pflughoeft

3
@ misha256这些sha1哈希供您检查下载是否损坏,而不是安全性。如果您需要安全性,请使用
带有

Answers:


41

对于SHA-1,尚无人完成。从理论上讲是可能的,但仍然不切实际。有关SHA-1中不安全性的报告仅表示,安全级别没有我们想要的那么高,这意味着我们没有那么多的时间像我们以前那样担心这个问题。

生成具有与给定文件相同的SHA-1哈希值的文件比自己制作具有相同SHA-1哈希值的两个文件更困难。据我们所知,世界上没有任何人甚至可以完成这项更轻松的任务。但这并不意味着明天就不会发生。


SHA-1是否存在与给定文件冲突的已知攻击?我给人的印象是,没有针对MD5或SHA-1都找到该攻击(只是碰撞攻击,而不是二次原像攻击)
cpast

@cpast Flame恶意软件使用MD5冲突似乎来自Microsoft,并劫持了Windows Update。他们可能有很多Microsoft证书可供选择,但他们不只是试图查找具有相同MD5的任何两个文件。
阿隆·福斯特

2
@Aron不,这不是与给定文件发生冲突的示例。有了Flame,Microsoft拥有了一个许可服务器,该服务器可以根据证书签名请求对X.509证书进行签名,这意味着攻击者可以在一定范围内控制正在签名的内容。他们没有发现与之冲突的先前存在的证书;Microsoft作为激活的一部分,从客户那里签署了CSR,从而允许使用冲突攻击(这不是第二原图像攻击)。
cpast

2
@OlivierDulac不,它的确从未完成过。没有已知的SHA-1冲突。估计费用只是一个估计值-这并不是说有人做到了,这是我们多么想它的成本,那就是没有人做过,但我们认为这是多少它花费。
cpast

4
@cpast我们不确定是否已经完成,但是300万美元的攻击费用不到NSA年度预算的0.03%(实际上,鉴于他们已经拥有硬件并且不拥有硬件,因此该攻击应该便宜一些必须租)。有一个合理的结论是,由于他们有这样做的能力和动力,那么他们可能已经做到了。记住火焰
贝恩2015年

26

从理论上讲这是可能的,但尚未完成。

您要查找的内容称为“哈希冲突:”两个具有相同哈希的文件。像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。

您实际上应该从威胁模型的角度做出此类决策。如果攻击者遭受这些碰撞之一,则可以造成多大的损害。您的攻击者是可以访问几台笔记本电脑的脚本小子,还是可以使用整个超级计算集群的政府?攻击者必须在多长时间的时间范围内才能破坏散列,然后再无用(许多密码学用途涉及“更改保护措施”,例如密码轮换)。所有这些都会影响您必须认真考虑碰撞的程度。


8
关于您的生日攻击段落,2 ^ 80是2 ^ 160的平方根,而不是一半(即2 ^ 159)。
Andrew Morton 2015年

问题是关于二次原像攻击,但您的答案是关于碰撞。针对SHA-1的原像攻击-— 甚至是MD5— 荒谬地不切实际。(针对MD5的2 ^ 123原像攻击,但是使用SHA-1时,您将受到2 ^ 160的蛮力攻击。)
Matt Nordhoff 2015年

“由于SHA-1是一个160位代码,因此平均需要2 ^ 159次蛮力尝试才能找到重复副本。” 但是2 ^ 2代码需要2 ^ 2个猜测。我不明白为什么你要-1。“长话短说,……”将算法的强度减半,因此SHA-1需要2 ^ 80”……“ MD5需要2 ^ 64”……“这些分别是160和128的一半。” 在这里您应该拥有-1'ed。这些位将成倍增加强度,因此将160位哈希的强度减半会将其视为159位哈希,而不是80位哈希。每一点都使暴力攻击的挑战倍增。
TOOGAM

@TOOGAM:他说“平均”;在多次试验中,平均仅需要搜索50%的密钥空间才能成功进行暴力攻击。至于减半的评论,安德鲁·莫顿的上述评论解释了这一点。它应该是复杂度的平方根,而不是一半。
Reid

@AndrewMorton好点,我不清楚我的措辞。我发现文献经常在状态数和状态数的以2为底的对数之间切换。我的用语是将位数减半,因为人们倾向于谈论位数的“强度”。我已经习惯了来回切换,所以我不知不觉地这样做了。我将进行编辑以消除混乱。
Cort Ammon-恢复莫妮卡2015年

8

那篇文章中讨论的SHA-1中的缺陷非常具体:它们使攻击者能够创建两个哈希值相同的事物(这称为“冲突攻击”)。但是,碰撞攻击要求攻击者控制涉及的两个文件。如果攻击者无法控制原始文件,则碰撞攻击不会使他们找到具有相同哈希值的另一个文件。

这对TLS / SSL(通常是签名)很重要的原因是,有了这些,攻击者通常可以控制两个文件。TLS证书主要是由请求它的人创建的(他们不控制的位通常是可预测的),因此冲突使他们可以制作合法证书和非法证书,获得合法证书并进行签名并进行转移。

对于文件,并非总是如此。如果您担心创建文件的人是攻击者(例如,他们将一件事情独立验证为好,然后向您发送具有相同哈希值的恶意负载),则SHA-1攻击适用,您应该注意逐步淘汰它(尽管它并不重要,正如David Schwartz提到的)。如果原始文件是可信任的,那么攻击者将无法施加当前已知的SHA-1攻击,尽管您仍应考虑逐步淘汰它(如果可以的话,请使用散列而不使用SHA-等已知攻击2)。


响应“碰撞将不会有用”-尽管攻击不需要攻击者能够获得有用的碰撞,但将“碰撞”转变为“有用的碰撞”通常并不难。许多文件格式都有很大的空间,您可以在其中拥有所需的任何内容而不会影响文件的功能。攻击者通常可以对其进行修改,以获取冲突(如果实际上可以找到冲突),同时将功能部分保持为他们希望的样子。“学术攻击”和“实践攻击”之间的差距可能很大;“任何碰撞”和“有用碰撞”之间的差距通常要小得多。


与算法选择无关的更严重的问题是如何获取哈希。散列所做的只是将问题从“获取真实文件”转移到“获取真实散列值”;从与文件相同的服务器和相同的连接类型发送的哈希值完全不值得进行恶意修改(任何可以篡改文件的攻击者都可以篡改哈希值)。仅当您对哈希的信任程度超过对文件的信任程度时,哈希才对此有用。尽管有时是这样(洪流,镜像),但在并非如此的情况下经常使用它们。因此,每当使用哈希进行完整性验证时,您都应该非常小心。


5

您必须区分碰撞攻击和原像攻击。查找任何两个散列为相同值的消息是冲突攻击。
用另一个具有相同哈希值的消息替换一个特定的给定消息(此处为可执行文件)是(第二次)原像攻击。

根据Wikipedia的一篇文章,SHA-1被破坏了,因为它可以在2 52次操作中完成一次碰撞攻击,但没有提供该数字的引用(据我所知,实际上是可信的最佳攻击是Marc Stevens所进行的攻击) ,需要2 60次操作)。但是,让我们假设 2 52是悲观的情况。

这是令人担忧的,因为从理论上讲,这种规模的攻击不仅可以想象,而且在多GPU平台上一天之内的确可以做到。对于“任何两个”消息都会起作用的应用程序来说,这当然是一个问题。如果您的攻击者愿意为这个问题投入一些额外的资金,或者愿意花费一年的时间,那么即使是Stevens给出的2 60的数字(工作量的256倍)也是完全可行的。
正是这种情况不会阻止从事间谍活动或网络犯罪的人伪造证书。

现在,原像攻击的指数是原来的两倍,因此假设碰撞攻击为2 52,即2 104次操作,这是完全不同的情况。

这不仅是不切实际的(比上一段提到的机器快十亿倍的机器仍将花费大约600万年的时间),而且考虑到我们微不足道的发电方式,这是完全不可能的。

进行如此庞大的计算将需要比我们能够负担得起的任何能量大得多的能源。不,不是一个像太阳一样的能源,但仍然是一个很大的能源。

实际上,您可以期望从1瓦中获得10至50 GFLOPS的任何东西。假设发生了某种奇迹,并且处理器在一夜之间的能源效率提高了数千倍,则可以假设1 SHA≈1 FLOP(相当乐观!)。这意味着要在10年内执行2 104次哈希计算,您需要一个10 12 W的电厂。为了在1年内进行攻击,您需要一个10 13 W的电厂。这大约是美国,法国和日本的整个核电厂的总产量的50倍,仅用于伪造一次哈希。

不会发生,实现相同目标的方法要简单得多(利用存储原始哈希的服务器并替换原始哈希,敲诈某人,等等)。


“ ...实现同一件事的简便得多的方法...”如xkcd.com/538所示
Ralph J

2

该问题所涉及的文章的一般要点是:SHA1已过时,应逐步淘汰,而您仍有时间顺利进行。在某些地区,自Google和Microsoft强制执行截止日期以来,时间已不多了。

不推荐使用的技术的经验法则:

  • 如果您进行新设计或添加功能,请不要使用它(SHA1)。
  • 如果您维护旧的东西,请制定一个计划,何时更换它(SHA1)。

布鲁斯·施耐尔(Bruce Schneier)在2012年博客中的摘要语录: “关键是我们社区中的人们现在需要开始从SHA-1迁移到SHA-2 / SHA-3。”


2

对于您问题的SHA-1哈希冲突部分,一些答案已解决了这一问题。

但是,其中很大一部分取决于我们正在处理的文件类型:

维护文件的整体内容和操作(但现在当然包括最初没有更改内容的恶意内容)

这意味着在检测更改方面有很大不同:

  • 如果它是经过签名的可执行文件,则不是(合理的)机会:您将不得不以某种方式遇到两次哈希冲突:文件的SHA-1和内部.exe签名。
  • 如果它是未签名的可执行文件,.com,.unsigned .dll或类似文件,则可以以不会改变其操作的方式添加其资源派生,因此(最终)您可能会(最终)获得“正常”无法检测到的哈希冲突操作。
  • 如果是源代码文件或类似的结构(.cs,.c,.h,.cpp,.rb,.yml,.config,.xml,.pl,.bat,.ini),则添加,修改或删除可以限制为有效的注释语法,以使大多数使用(编译或运行它,而不用文本编辑器打开它)无法识别更改。
  • 如果是.iso或.zip或其他容器格式,则也不太可能,因为大多数随机更改都会破坏容器。可以这样做:添加一个伪造的文件条目或更改容器中的内容并重新检查它,但是这增加了一层复杂性,并增加了额外的时间来检查结果,并且相对自由度有限如何更改内容以及如何更改。
  • 如果是文本或类似文本的格式,则尽管它们的内容可能会很明显,但它们仍然可以是“有效”文件,几乎可以按照您喜欢的任何方式进行更改。
  • 对于许多格式,例如.rtf,.doc,.html,.xslx和其他类似标记的格式,可以以解析器无法检测到的方式添加或修改它们,而不是使用长度(甚至限制长度) (自由度较小)文件可以更改为(最终)发生哈希冲突,同时仍然不仅是有效文件,而且以与使用它们的典型应用程序可见的任何方式进行显着更改。

因此,剩下的就是如何在不损坏且可能无法检测到的任何结构中发生碰撞:

  1. 进行所需的任何功能更改(可能插入恶意内容),并进行任何其他更改以保留特定于文件格式的有效性
  2. 添加一个将不起作用的部分(在注释块之间,在文本文件的末尾,其上方有3k回车符,隔离当前注释块)
  3. 添加或选择一个字符/代码点/字节进行修改,然后尝试所有可能的有效组合(例如,并非每个字节组合都适用于不同的编码)。
  4. 重新计算哈希,看看冲突是否匹配。
  5. 如果不是,请转到3。

假设您有一台超级快速的计算机和一个较小的文件,因此使用有效字节序列进行修改并重新计算哈希值需要1毫秒(可能需要一些专用硬件)。如果哈希分布是完全随机的并且分布在整个范围内,则每次2^160尝试都会与SHA-1发生冲突(强行强制使用它)。

2^160/1000/60/60/24/365.24 
= 4.63x10^37 years 
= 46,300,000,000,000,000,000,000,000,000,000,000,000 years 
= 46 undecillion years.

但是,让我们尝试使用2^602^52版本,并假设它们允许我们以我们喜欢的方式修改文件(他们不喜欢),并且每次也可以在1毫秒内完成修改:

2^52 yields 142,714 years 
/*humans might still be around to care, but not about these antiquated formats*/
2^60 yields 3.65x10^7 years = 36,500,000 years 
/*machines will probably have taken over anyway*/

但是,嘿,您可能会很幸运。真的,真的,比任何人称呼奇迹更幸运的是奇迹。


0

并非如此,您一次只能满足其中一个条件,但不能同时满足两个条件。.可能会为两个不同的文件获得相同的哈希值,但有人更改文件然后尝试获得相同的哈希值几乎是不可能的,因为据我所知


1
几乎是不可能。有了足够的计算能力,一切皆有可能。

-6

对的,这是可能的。想想病毒如何在EXE上工作。恶意软件有效载荷将附加到原始EXE,因此该程序仍然可以执行其最初的操作,但也可以作为病毒传播。现在,要保持相同的哈希值,您将需要其他专门设计的padding

这意味着该文件将更大。但是对于EXE来说,也许您可​​以删除一些较少使用的代码,以使该程序仅在开始时可以工作。对于JPEG,您可以进一步压缩图像或完全使用其他图像。对于ISO,您可以删除文件集。复制散列所需的计算将更加困难,并且在特定情况下可能在数学上是不可能的,但是总体上仍然可能。


7
-1此帖中的所有内容均已完全组成。长度扩展攻击不会 “保持相同的散列” (散列只是以已知的方式改变)。而且,没有理由没有病毒必须删除“较少使用的代码” (它甚至将如何确定它是什么?)。jpeg与什么有关系!?
BlueRaja-Danny Pflughoeft 2015年

2
这完全是错误的,在不重写整个答案的情况下,我什至无法开始提出更正
Mark K Cowan

2
-1完全不对。又名“甚至没有错”(沃尔夫冈·波利)
Olivier Dulac

1
好吧,我们可以从这样一个事实开始:如果总的来说可能,那么在特定情况下显然是有可能的。相反,情况并非总是如此:很容易想象一个可以针对特定情况解决的问题,但通常无法解决。
CVn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.