我读了一篇有关密码方案的文章,该文章提出了两个看似矛盾的主张:

MD5损坏;用作通用哈希太慢了; etc
问题在于MD5速度很快

我知道MD5不应用于密码哈希,并且也不应用于文档完整性检查。有太多来源援引MD5预映像攻击和MD5的低计算时间。
但是,我的印象是MD5仍可以用作非加密哈希函数:

恶意文件,例如Linux Mint的下载服务器受到破坏,而ISO文件被恶意文件替换;在这种情况下,您要确保文件不匹配;碰撞攻击不是这里的载体。
查找重复文件。通过MD5对目录结构中的所有文件求和,很容易找到相同的哈希值。然后可以对看似相同的文件进行完整比较,以检查它们是否确实相同。使用SHA512会使过程变慢,并且由于无论如何我们都将文件进行完整比较,因此不会存在MD5可能出现误报的风险。 (以某种方式,这将创建一个彩虹表,其中所有文件都是字典)

当然也有校验和,但是根据我的经验,有可能找到两个具有相同MD5的不同文件只要我们可以排除犯规行为,哈希值就非常低。
当密码方案文章指出“ MD5快速”时,它很明显地涉及到哈希值MD5在哈希较大值时过于便宜的问题。查找哈希反向的密码数量。但是,当它说“ [MD5]太慢而不能用作通用哈希”时,这意味着什么?是否有更快的标准化散列来比较文件,但文件碰撞的可能性仍然较低?

评论

问题是碰撞攻击,但是MD5仍具有图像前阻力。

“使用SHA512会使过程变慢...”-在我的系统上,openssl的MD5报告速度为747MB / s,SHA-512报告为738MB / s,所以几乎没有什么不同;)

我相信MD5仍可以用作PRF。

对于具有优化实现的amd64处理器上的较长文件,我认为SHA-512是更快的哈希算法之一(比SHA-256更快,因为类型大小更易于操作)。

有趣的事实:MD4仍在数百万个设备上使用。 Linux中流行的ext4文件系统内部使用了一半的MD4来生成哈希树。我敢肯定,即使对于MD5,也有很多其他用途。

#1 楼


我知道MD5不应用于密码散列,并且也不应用于文档完整性检查。有太多来源援引MD5预映像攻击和MD5的低计算时间。


没有公开的MD5前映像攻击比对任何128位哈希函数的通用攻击便宜。但是,在制定安全决策时,您不应该一个人依靠它,因为加密非常棘手,对手聪明又机灵,可以找到解决方法!



识别恶意文件,例如Linux Mint的下载服务器遭到破坏,而ISO文件被恶意文件替换;在这种情况下,您要确保文件不匹配;冲突攻击不是这里的媒介。


在折衷方案之后是否发布已知有效哈希与已知不良哈希的问题在其他地方得到了解决-简而言之,发布已知的坏散列并没有多少成就,据引证,Linux Mint发布了已知的好散列。那么,从知名的MD5散列中获得什么安全性呢?

这里有两个问题:



如果您从MD5哈希中获取与ISO映像相同的来源,没有什么可以阻止对手替换MD5哈希和ISO映像。

为防止这种情况,您和Linux Mint策展人需要两个渠道:一个用于不能被破坏的哈希(但只需要非常低的带宽),以及用于ISO映像的另一个哈希(需要高带宽),然后您可以在其上使用MD5哈希来尝试检测破坏。

防止这种情况的另一种方法是:随着时间的流逝,不要一遍又一遍地使用不妥协的通道来处理每个ISO映像的哈希-这意味着攻击者有越来越多的机会来破坏它-最初使用它一次作为公钥,然后用于对ISO映像进行签名;那么攻击者只有一个机会来破坏公钥通道。


即使您从已知来源获得MD5哈希,在某些情况下,碰撞攻击仍可能是一种媒介像这样。请考虑以下情形:


我是一个邪恶的开发人员。我编写了两个软件包,它们的发行版在MD5下发生冲突。其中一个软件包是良性的,可以在审查和审核后幸存。另一位将用寿司的色情照片秘密地替换您的家庭相册。
Linux Mint策展人仔细检查和审核他们在软件包存储库中发布的所有内容,并在公共场所发布他们审核过的MD5哈希值,我不能妥协。
Linux Mint策展人在已发布的MD5哈希将保护用户的错误印象下,轻而易举地管理其软件包存储库中的软件包分发。

在这种情况下,我可以用色情寿司包装代替良性包装,通过MD5验证并获得飞跃的色彩,并且当您尝试查找带孩子的那趟旧远足旅行的照片时,会给您带来讨厌而又甜美的惊喜。




查找重复文件。通过MD5对目录结构中的所有文件求和,很容易找到相同的哈希值。然后可以对看似相同的文件进行完整比较,以检查它们是否确实相同。使用SHA512会使过程变慢,并且由于无论如何我们都将文件进行完整比较,因此不会存在MD5可能出现误报的风险。




当我将我的良性软件包和色情寿司软件包(在MD5下碰撞)放在您的目录中时,您的重复检测脚本最初会认为它们是重复的。在这种情况下,您绝对必须完整比较文件。但是还有更好的方法可以做到这一点!


如果使用SHA-512,则可以安全地跳过比较步骤。如果使用BLAKE2b,甚至比MD5还要快,则相同。
如果您在统一随机密钥下将其用作HMAC-MD5,甚至可以安全地使用MD5,并安全地跳过比较步骤。 HMAC-MD5作为伪随机函数族似乎没有坏过,因此对于安全性来说,直到生日前一天都还不错,但是有更快的PRF(例如带键的BLAKE2)不会引起审核员的注意。 />甚至更好的是,您可以选择一个随机密钥,然后在密钥下使用通用哈希对文件进行哈希,例如Poly1305。这比MD5或BLAKE2b快许多倍,并且任何两个文件之间发生冲突的可能性小于$ 1/2 ^ {100} $,因此$ n $个文件之间发生冲突的可能性小于$ \ binom n 2 2 ^ {-100} $,因此您仍然可以安全地跳过比较步骤,直到拥有四千万个文件为止。
您还可以使用便宜的校验和,例如带有固定多项式的CRC。这将是最快的选项,远比MD5快得多,但是与以前的选项不同,您仍然必须绝对比较文件。

因此,MD5安全地查找候选重复项以进行验证,如果您随后逐个比较文件的完整程度?是。常数零函数也是如此。


(以某种方式,这将创建一个彩虹表,其中所有文件均为字典)


这不是彩虹桌。彩虹表是一种特殊的技术,它可以通过MD5哈希值预先计算某个密码空间上的随机游动,这种方式可以找到MD5前映像,这些哈希值不一定需要在您的表中使用较少的试验哈希值评估比天真的搜寻。 (它也可以与搜索同时进行,不仅可以加快搜索速度,而且可以降低性价比。)这不仅仅是输入字典上的一系列预先计算的哈希。

(您引用的tptacek在2007年的博客文章以及Jeff Atwood的博客文章都是对彩虹表的误解。tptacek在2019年声称他关于彩虹表的DGAF,也许是因为现代密码哈希阻止了它们仅使用盐即可使用,但是在固定的,不加盐的散列函数下进行密码搜索只是该概念的一种应用,该术语已广为人知。密钥给出了已知的明文/密文对。这不只是琐碎的时间/内存折衷-如果进行并行化,彩虹表前映像搜索可以降低性价比,因此,例如,AES-128不应解释为提供“ 128位安全性”。)


当密码方案文章指出“ MD5速度很快”时,它显然是指在对大量密码进行哈希处理以查找哈希值的反面时,哈希MD5过于便宜的问题。但是,当它说“ [MD5]太慢而不能用作通用哈希”时,这意味着什么?是否有更快的标准化散列来比较文件,但文件碰撞的可能性仍然较低?


我不知道tptacek是什么意思,您可以通过电子邮件发送和询问,但是如果我不得不猜测,我想这意味着对于哈希表之类的东西来说它的运行速度非常慢,您可以将MD5截断到几位来确定索引。存储桶数组或开放地址数组。

评论


$ \ begingroup $
为什么选择其他哈希算法可以消除发生冲突的风险(寿司项目符号)?
$ \ endgroup $
–克莱里斯-谨慎乐观-
19-4-25在18:09



$ \ begingroup $
@chrylis从来没有人发布过找到SHA-512或BLAKE2b碰撞的方法,甚至没有找到SHA-256碰撞的方法。
$ \ endgroup $
–吱吱作响的s骨
19-4-25在19:19



$ \ begingroup $
@Alexander的“哈希函数”含义很多,通常在某些情况下(随机oracle模型,伪随机函数族,伪随机排列族等)近似于统一的随机函数选择。 “校验和”用于某些错误检测功能;例如,设计良好的32位CRC可以保证检测到任何1位错误,并且通常可以保证在某些数据字长中检测到大量的位错误,而SHA-256的32位截断可能无法检测到某些1位错误。但是,这些术语通常使用非常宽松。
$ \ endgroup $
–吱吱作响的s骨
19年4月25日在19:28

$ \ begingroup $
@SqueamishOssifrage“ CRC保证可以检测到任何1位错误,并且通常可以保证在某些数据字长中检测到大量的位错误,而SHA-256的32位截断可能无法检测到1位错误。有点错误。那真的很强大,也很酷。我不知道我会读更多!
$ \ endgroup $
–亚历山大
19年4月25日在19:36

$ \ begingroup $
我认为您误解了Linux Mint案。他们从骇客复原后,发布了受感染ISO的MD5哈希值,以便人们可以检查从其安装的ISO是否受到感染。您的寿司故事似乎暗示您认为MD5用于证明原始未感染ISO文件的完整性。此情况并非如此。
$ \ endgroup $
–jornane
19年4月25日在21:14

#2 楼


但是,当它说“ [MD5太慢而不能用作通用哈希”时,这意味着什么?是否有更快的标准化哈希来比较文件,但仍然有较低的发生冲突的可能性?与MD5大小相同(小于MD5的30)。

#3 楼

没有迫切的理由使用MD5。但是,有些嵌入式系统使用MD5内核作为流验证器。在那些系统中,仍使用MD5。他们之所以选择BLAKE2,是因为它的硅片较小,并且具有比一般的MD5更快的优势。 MD5消息的扩展似乎很简单,但实际上
它们需要大量的电路用于多路分解和互连,并且与BLAKE相比,其硬件效率大大降低。相比之下,用于BLAKE算法的消息扩展块可以有效地实现为简单的反馈移位寄存器。

BLAKE团队做了出色的工作,使其可以在芯片和指令上正常工作。

编辑:SHA-1,SHA-2等在电路中也看起来不错。

评论


$ \ begingroup $
我不了解BLAKE,这似乎很有趣。我从帖子中假设会有某种哈希系统,该哈希系统在密码上不安全,无法比MD5更快,但是BLAKE似乎是两全其美的。我正在考虑将此答案视为可接受的答案,但是我将等待几天,以便围绕该问题进行活动。
$ \ endgroup $
–jornane
19年4月25日在21:28

$ \ begingroup $
@jornane Squeamish Ossifrage有一个更好的答案。我只想提及硬件方面。
$ \ endgroup $
–b degnan
19年4月26日在0:23

#4 楼

如果您不关心哈希的故意攻击,那么您根本就不需要加密哈希。有一些算法非常非常快,可以为大多数数据提供出色的抗冲突性,但对于有意攻击却没有。看看xxhash。

评论


$ \ begingroup $
如果输入具有某些属性,则非加密哈希可能容易受到意外冲突的影响。加密哈希确保这些属性极不可能偶然发生。
$ \ endgroup $
–森林
19-09-14在1:52



#5 楼


我知道不应将MD​​5用于密码哈希


确实。但是,这与MD5直接适用于密码或仅将密码和盐一起使用有关。在那种情况下,MD5的安全性不如具有工作因子的专用密码哈希安全,至少对于普通密码和密码短语而言是不安全的。哈希还是可以的,因为它依靠图像前抵抗力来保证安全性,而不是抗碰撞能力。

我不敢打赌MD5仍然可以保持图像前抵抗力。攻击只会变得更好,尽管我看不到在打破MD5的图像前抵抗力方面取得任何进展,但我也不能排除它。下载服务器遭到破坏,ISO文件被恶意文件替换;在这种情况下,您要确保文件不匹配;冲突攻击不是这里的媒介。只要黑客无法更改MD5哈希的输入,MD5仍然可以安全地检查来自其他服务器的哈希。但是,对于像完整的ISO这样的东西,我想说他们将有很多机会引入看上去对内容无害的二进制文件,同时它们改变了容易受到碰撞攻击的MD5中间状态。

那不是您提到的攻击;在那种情况下,官方服务器上的MD5哈希值与通过ISO映像计算得出的哈希值不同。 。这可能不是那么容易(在ISO开头等正确地排列攻击所需的二进制数据),但是它仍然是攻击的载体。

顺便说一句,Git中的SHA-1也是如此。无论Linus怎么说,都不容易突破,但绝非不可能。


查找重复文件。通过MD5对目录结构中的所有文件求和,很容易找到相同的哈希值。然后可以对看似相同的文件进行完整比较,以检查它们是否确实相同。使用SHA512会使过程变慢,并且由于无论如何我们都将文件进行完整比较,因此不会存在MD5可能出现误报的风险。 (从某种意义上讲,这将创建一个彩虹表,其中所有文件都是字典) MD5很好。

但是,如果存在攻击媒介,那么即使在哈希匹配之后,也需要执行完整的二进制比较。否则,攻击者可能会让您检索错误的重复数据删除文件。如果您使用加密强度高的哈希,则根本不需要执行完整的文件比较。正如其他人所注意到的,与存储时执行完整文件比较相比,处理256-512位哈希值要容易得多。两次传递文件也不是很快。

此外,如果您将使用散列来引用它,则无法进行比较。您将只有一个文件(毕竟这与重复数据删除有关)。


“ [MD5太慢而不能用作通用哈希”?是否有更快的标准化哈希来比较文件,而这些文件仍然有较低的冲突机会?


其他人已经提到过密钥哈希(消息身份验证代码)和非加密哈希,还有一个或两个真正快速的加密哈希,它们更安全,通常速度与MD5一样快。但是,是的,随着加密散列的发展,MD5肯定相当快。这主要是因为它不复杂并且状态/输出大小较小。

我们发现,MD5非常简单,因此很容易损坏。其他算法(例如SHA-256和-512)在很大程度上依赖相同的原理,但仍被认为是安全的。请注意,较新的Intel和AMD处理器具有SHA-256加速,因此,如果确实使用了硬件加速,则它们的性能可能与MD5相似。


如您所见,MD5绝不是好主意,而且许多(聪明)人仍然认为MD5或SHA-1在“其特定情况下”是安全的。通常可以证明它们是错误的,并为系统(未来)的攻击敞开了大门。在任何情况下,我都尽量避免使用它,尤其是如果在HMAC中未使用它。

我还看到它受到保护,因为无法升级系统。 MD5已经遭受攻击多年。如果您仍然无法从MD5迁移过来,那么您的系统安全性将严重超越MD5的使用范围。如果您正在设计/编程或保持系统没有升级路径,那么您将是主要的安全隐患,而不是哈希算法。

评论


$ \ begingroup $
没有使用MD5的现代密码哈希。一个人可以用HMAC-MD5实例化PBKDF2,但是我不确定我是否见过有人这样做,并且如果一个人开始做出自定义选择,那么不妨选择一个现代的密码哈希!
$ \ endgroup $
–吱吱作响的s骨
19年4月26日在23:28

$ \ begingroup $
我非常擅长SO,我已经看过很多次了。人们知道MD5,并且出于某种原因喜欢使用它。
$ \ endgroup $
–马腾·博德威斯♦
19年4月26日在23:42

$ \ begingroup $
>只要黑客无法更改MD5哈希的输入,MD5仍然可以安全地检查来自其他服务器的哈希。 $$$$这需要非常仔细的鉴定。如果您对密码学不是很熟悉,那么攻击者可以对输入进行多少控制的问题就非常微妙,而且不明显。请参阅crypto.stackexchange.com/a/70057上的故事,其中攻击者在检测到最初的危害时并没有进行任何更改,但即使他们验证了良好的MD5哈希值,最终仍会危害所有人。
$ \ endgroup $
–吱吱作响的s骨
19-4-26在23:43



$ \ begingroup $
好吧,这就是我的回答的重点,您认为自己很安全,但事实并非如此。您发布的内容是一个有趣的攻击媒介,但它仍然依靠对手(或他的同伴之一,从理论上讲是同一件事)来控制哈希的输入。
$ \ endgroup $
–马腾·博德威斯♦
19年4月26日在23:47

#6 楼

使用MD5-hash仍然有意义(删除重复文件的风险很小)的情况:

如果要查找重复文件,则可以使用CRC32。

一旦两个文件返回相同的CRC32哈希,您将使用MD5哈希重新计算文件。如果两个文件的MD5哈希值再次相同,那么您就知道这些文件是重复的。希望处理速度更快:而是使用对文件的第二个哈希(即SHA2或SHA3)不易受攻击的哈希函数。这些散列返回相同的散列的可能性极小。

速度无关紧要:逐字节比较文件。

评论


$ \ begingroup $
评论不用于扩展讨论;此对话已移至聊天。
$ \ endgroup $
–马腾·博德威斯♦
19年4月27日在20:34

#7 楼

MD5当前在世界各地的家庭和企业中都使用。如果您选择了更改时间戳记检测之外的其他方法,则这是* nix的rsync中的文件更改机制。它用于内部系统之间的备份,归档和文件传输。甚至在企业之间也通过VPN。

您的评论“它不应该用于文档完整性检查”很有趣,因为这是在传输文件(也称为文档)时要做的事情。从哲学上说,被黑的文件/文档是已更改的文件/文档。如果在源系统上,攻击者以一种聪明的方式更改了文档以产生相同的MD5哈希,则该文档将不会继续传播到目标系统,因为rsync认为该文档没有更改。由于现在可以快速找到冲突的散列,因此rsync可能不会引起对精心设计的更改的注意,并且可能会发生(小众)攻击。

因此,如果您问“ MD5真的不再有用了吗?”,答案是它已经在家庭和企业中广泛使用。

在在rsync的情况下,考虑到存储和网络开销,将MD5换成更快的速度只会带来整体速度的提高。这肯定会比简单的哈希率比率所暗示的要小。

评论


$ \ begingroup $
我认为librsync现在实际上使用BLAKE2。
$ \ endgroup $
–森林
19年4月26日在1:30

$ \ begingroup $
BLAKE2b是512,BLAKE2s是256。当然,它可以被截断。
$ \ endgroup $
–森林
19年4月26日在2:20

$ \ begingroup $
可以进行截断以保持与协议的兼容性。如果该协议是为128位哈希而设计的,则截断更大的哈希比更改协议更简单(可能会在旨在使开销最小化的事物上增加更多开销)。我不确定它是否像使用MD5一样使用BLAKE2,但我确实知道它是“用BLAKE2替换MD5”。该代码已添加到librsync。
$ \ endgroup $
–森林
19-4-26的2:41



$ \ begingroup $
@forest所有这些编码方面的内容听起来都很困难,但我认为if(protocol_version> = 30)返回CSUM_MD5;在download.samba.org/pub/unpacked/rsync/checksum.c中调用download.samba.org/pub/unpacked/rsync/lib/md5.c。它似乎是自给自足的。也许您有不同版本的rsync?即使没有更改,任何更改都必须是最近才进行的,因此仍然会有很多MD5 ...
$ \ endgroup $
–Paul Uszak
19-4-26在2:48



$ \ begingroup $
我链接到提供后端的librsync。
$ \ endgroup $
–森林
19年4月26日在2:50

#8 楼

这里没有提到的一件事是,哈希算法(例如编程语言等)的吸引力无处不在。使用MD5的“原因”是:


每个人都知道它
它几乎适用于架构,操作系统,编程语言等的所有组合
众所周知。

从实用性和安全性角度来看,这都很重要。
期望有人能够处理它是很合理的(实用性),并且可以帮助开发人员审核流程而不要跳过步骤,因为它们是“棘手的”(安全性)。很快。因为它只有一个自我实现的预言,因为它通常首先会有更好的选择,所以它一开始就很受欢迎。拥有使用MD5的权利(在限制范围内)。

评论


$ \ begingroup $
欢迎使用crypto.stackexchange-我认为有一些附加功能可以改善此答案:似乎要点同样适用于SHA1 / SHA2(考虑到它们是标准化算法)。很明显,这些观点为什么会促进算法的使用,但是我不清楚为什么它们会促进MD5优于SHA1 / SHA2。最后一点似乎是说“其他人都在做”是使用MD5的充分理由(很少是做任何事情的良好理由)。它还提到了限制,但是没有详细说明这些限制应该是什么。
$ \ endgroup $
–艾拉·罗斯(Ella Rose)
19年4月26日在14:51

$ \ begingroup $
自从汉斯·多贝特(Hans Dobbertin)在1996年发布碰撞功能以来,使用MD5一直是一个问题的四分之一世纪,而自从王晓云的团队在2004年展示碰撞以来,MD5已经被完全破坏了十五年。美国和以色列在实践中利用了MD5中的“核武器”来破坏伊朗的核计划。 SHA-2自2002年问世以来已有17年的历史。注意SHA-0和SHA-1也已损坏;时间线。 $$$$凯撒密码也符合您的所有条件。
$ \ endgroup $
–吱吱作响的s骨
19-4-26的15:19



$ \ begingroup $
太清楚了:我认为MD5并不比SHA-2更好(或更好)。问题不是“哪个更好”,而是有任何理由使用MD5。当然,SHA-2不得不接手17年,并且已经被广泛使用,这是一个不错的选择。特别是如果您是Internet连接的Windows / Linux空间。如果那是您的位置,并且没有特殊情况,请不要使用MD5,这是更好的选择。但这不是问题。获得信任需要一段时间,并且某些技术堆栈的移动速度较慢。有时候17年没那么长。
$ \ endgroup $
–Anone
19年4月26日在15:43

$ \ begingroup $
如果某人(a)实际设计协议(b)限于特定的真实环境,并且(c)由于可以表达的特定技术原因而限制在该环境中的MD5,则他们可以提出问题其中我们提供了有关安全性的有用指导。情况并非如此:原始海报询问便利性,可轻松使用SHA-2的功能强大的计算机上的临时漏洞披露,保持冲突概率低的廉价方法等。
$ \ endgroup $
–吱吱作响的s骨
19年4月26日在15:49

$ \ begingroup $
@SqueamishOssifrage当然可以,但这不是问题。同样,如果您正在寻找哈希建议并且您的研究是:阅读一个题为:“ MD5真的不再使用了吗?上面写着“为完整性着想:也许吧”,并用它来代表MD5的获胜...在这一点上,如果没有合法理由说人们有过于消极。我认为,诚实地对待自己的弱点总比吓退人们好。
$ \ endgroup $
–Anone
19年4月26日在16:08