在$ a == md5($ b.$ secret)中找到$ secret

Nik*_*las 7 php security md5 cryptography black-box

功能是:

$a == md5($b . $secret);
Run Code Online (Sandbox Code Playgroud)
  • 您可以选择$ a和$ b
  • 你不知道$ secret
  • 您获得的$ a和$ b函数的值为true或false.

是否有比蛮力更好的攻击来找到一般的$ secret?有没有比使用PHP的md5功能找到$ secret的暴力更好的攻击?

从我在网上找到的内容我认为没有,尽管md5已被弃用用于其他一些用例.所以只是为了确定......

亲切的问候

Tho*_*nin 4

如果 MD5 的行为就像一个随机预言(这是一个很大的“如果”,见下文),那么彻底搜索$secret就是最好的攻击——更重要的是,对 值的每个“猜测”都$secret必须使用对该函数的查询(由于您使用 PHP,我假设该功能是在 Web 服务器中实现的,并且每个“查询”都需要与该服务器通信)。True后者是由于缺乏发送回攻击者的信息而暗示的:攻击者除了单个位(“ ”或“ ”结果)之外什么也得不到False。特别是,他没有得到 MD5 输出本身。攻击者将获得一长串无信息的“ False”结果,除非他命中正确的 MD5 输出,这要么是出于纯粹的偶然(概率 2 -128,这实在是太小了),要么是因为他事先正确猜测了 的值$secret。值得注意的是,这可以防止攻击者使用许多成本分摊技术,包括预先计算的表,特别是过度炒作的彩虹表

随机预言机是一个虚构的对象,可以将其视为确定性的黑匣子:您对从给定输入获得的输出一无所知,除了黑匣子对于给定输入总是返回相同的结果。模型如下:盒子里有一个侏儒、一些骰子和一本大书。侏儒使用骰子来随机选择输出。他还使用这本书来跟踪他已经发送的答案,以便保持一致,即如果输入与先前提交的输入相同,则侏儒将返回与先前相同的输出,而不是扔骰子。

然而,MD5 并不是随机预言。例如,对于具有 128 位输出的函数,我们可以比理论上的 2 64阻力更快地建立 MD5 碰撞。另外,请注意,成为一个好的哈希函数(抗冲突等)并不绝对需要“随机预言”。例如,SHA-256被认为是一种安全哈希函数,但它仍然遭受所谓的“长度扩展攻击”(假设,人们可以在不知道 的情况下SHA256($a)计算,对于 的几乎任意值)。因此,MD5(或 SHA-256)不能保证随机预言。这并不意味着更快的攻击是已知的!只是你在这里只能靠自己。SHA256($a . $b)$a$b

还可以指出这md5($b . $secret)是一种“密钥散列”,即MAC(消息认证码)。从哈希函数构建 MAC 并不容易,正是因为诸如长度扩展攻击之类的事情(md5($secret . $b)例如,将是一个非常糟糕的 MAC)。一种用哈希函数构建 MAC 的稳健方法已经被设计出来;它称为HMAC,涉及对底层哈希函数的两次调用(但其中一次是在短输入上,因此这仍然是有效的)。HMAC 的安全性,更准确地说,HMAC 如何被视为随机预言机,可以被“证明”,即简化为一些哈希函数内部属性,这些属性在 SHA-256 的情况下被认为是正确的(请参阅 NMAC 的新证明和HMAC:Mihir Bellare 的《没有防碰撞的安全》,了解血淋淋的细节)。通过使用 HMAC/SHA-256 over $b, with$secret作为密钥,您将从这些安全结果中受益,并且您的构建将更加可靠。再说一次,我并不是说存在对 的已知攻击md5($b . $secret),只是说 MD5 的使用自制的 MAC 构造都会引发危险信号,从而降低可赋予此类系统的信任级别。