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

7

函数是:

$a == md5($b . $secret);
  • 您可以选择 $a 和 $b。
  • 您不知道 $secret。
  • 您选择的 $a 和 $b 的函数值为 true 或 false。

一般情况下,是否有比暴力破解更好的方法来查找 $secret?

使用 PHP 的 md5 函数,是否有比暴力破解更好的方法来查找 $secret?

从我在网上找到的资料来看,我认为没有,尽管 md5 已经被弃用于某些其他用例。所以只是为了确保一下...

此致敬礼

3个回答

4
如果MD5表现得像一个随机数发生器(这是个很大的“如果”,请见下文),那么对$secret进行穷举搜索就是最好的攻击方式——更重要的是,每次对$secret的值进行“猜测”都必须使用一次函数查询(由于您使用的是PHP,我假设该函数在Web服务器中实现,并且每个“查询”都需要与该服务器通信)。后者是由信息未被发送回攻击者所暗示的:攻击者除了一个单一的比特(“True”或“False”结果)外什么也得不到。特别地,他得不到MD5输出本身。攻击者将会获得一长串无用的“False”结果,除非他碰巧得到正确的MD5输出(概率为2-128,非常小),或者他事先准确地猜到了$secret的值。值得注意的是,这防止了攻击者使用许多成本共享技术,包括预计算表,尤其是被过度宣传的彩虹表

随机预言机是一种神话般的对象,可以看作是一个确定性黑盒子:你对于任何给定的输入所得到的输出一无所知,除了该盒子总是对于同一输入返回相同的结果。一个模型如下:盒子内含有侏儒、几个骰子和一本大书。侏儒使用骰子随机选择输出结果。他还使用这本书来记录他已经发送过的答案,从而保持一致,即如果输入与之前提交的输入相同,则侏儒会返回与之前相同的输出而不是掷骰子。

然而,MD5并不是一个随机预言机。例如,我们可以比理论上128位输出函数的264防抗更快地构建MD5碰撞。此外,请注意,成为良好的哈希函数(抗碰撞等)并不绝对需要“随机预言机性质”。例如,SHA-256被认为是一种安全的哈希函数,但它仍然受到所谓的“长度扩展攻击”的影响(给定SHA256($a),可以计算SHA256($a . $b)而不知道$a,对于几乎任意值的$b)。因此,MD5(或者说SHA-256)不具备随机预言机的保证。这并不意味着已知有更快的攻击方法!只是你自己面临风险。

可以指出,md5($b . $secret)也是一种“键控哈希”,即MAC(消息认证码)。使用哈希函数构建MAC并不容易,正是因为像长度扩展攻击这样的问题(例如,md5($secret . $b)将是一个非常糟糕的MAC)。已经设计了一种构建哈希函数的MAC的强大方法; 它被称为HMAC,涉及对底层哈希函数的两次调用(但其中一次是在短输入上,因此这仍然是有效的)。HMAC的安全性,更准确地说,如何将HMAC视为随机预言机,可以“证明”,即可归结为SHA-256情况下被认为是真实的一些哈希函数内部属性(有关详细信息,请参见Mihir Bellare的NMAC和HMAC的新证明:无需冲突防止)。通过使用以$secret为密钥的HMAC / SHA-256覆盖$b,您将受益于这些安全结果,并且您的构造将更加令人信服。再次强调,我并不声称对md5($b . $secret)存在已知攻击,只是MD5的使用和自制MAC构造引发了警觉,这降低了可以赋予此类系统的信任级别。

3
这是一个有趣的问题,因为在典型的IT安全场景中,你不能选择$ a和$ b作为攻击者。例如,如果你能够获得哈希密码,则$ a和$ b已经被定义,你只能使用暴力破解或彩虹表(如果具有盐值$b)来解密。在这种情况下,您只能使用暴力破解或者如果有一个带有盐值$b$的彩虹表,则可以使用它。
另一方面,在您的示例中,您可以自由选择两个值。您可以采用任意的秘密,例如“test”,并相应地选择$ a和$ b的值。我选择$b为空字符串,并使用$ a = md5($ secret)$计算$ a $,结果为$ 098f6bcd4621d373cade4e832627b4f6$。
我选择$ a=“098f6bcd4621d373cade4e832627b4f6”$和$ b =“”$,并问您$ secret ==“test”$是否成立。您说true,我说问题解决了。
最终,这引导我们到真正的答案。给出的两个条件:
- 您可以选择$ a和$ b - 您不知道$ secret
这两个条件不起作用。在我的示例中,我自己定义了$ secret。我违反了第二个条件。另一方面,我无法任意选择$ a和$ b而不是从$ secret中派生它们,因为它们可能没有解决方案。
如果我们假设所有可能的$ a和$ b对都至少有一个解(也许有证明,我不知道),并且您以一种您真的不知道$ secret的方式选择它们,那么我总是想定义$ b =“”$,以尽可能轻松地进行攻击。在这种情况下,彩虹表是您的朋友。

1

下载一个彩虹表/著名密码的密码哈希值!:)


1
这几乎是唯一的选择,除了暴力攻击。但需要注意的是,现在可以相当快地计算出MD5散列值,因此不应低估暴力攻击的威胁。实际加密/安全专家推荐使用Bcrypt或Blowfish算法(因为它们在密码学上更加安全,并且可以通过任意数量的加密轮数来减缓破解速度)。 - Jani Hartikainen
1
彩虹表不起作用,因为有盐(除非盐的长度+密码的长度小于8,这是非常不可能的)。你需要暴力破解它,这需要很长时间。 - Jess
但如果你足够幸运,得到相同的盐 :) - Sourav
我应该指出,你只能得到TRUE或FALSE。所以彩虹表行不通。但是著名的密码列表可能会有所帮助。 - Niklas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接