2011-04-24 105 views
7

功能是:

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

有没有更好的攻击比蛮力找到一般的$秘密? 使用PHP's md5 function有没有比蛮力找到$ secret更好的攻击?

从我在网上找到的东西我认为没有,虽然md5已被弃用一些其他用例。因此,只要是的......

亲切的问候

回答

3

如果MD5的行为像一个随机预言(这是一个很大的“如果”,见下文),那么在$secret上的详尽搜索是最好的攻击 - 更重要的是,每个“猜测”$secret的值必须对函数使用查询(因为您使用PHP,我假设该函数在Web服务器中实现,并且每个“查询”需要与该服务器交谈)。后者的缺点是缺乏发送给攻击者的信息:攻击者除了单一位之外没有任何东西(“True”或“False”的结果)。特别是,他本身并没有获得MD5输出。攻击者会得到很长的信息流的“False”结果,除非他碰到了正确的MD5输出,要么出于纯粹的机会(概率2 -128,这是真的很小),或者因为他正确猜测了值$secret预先。值得注意的是,这可以防止攻击者使用许多成本分摊技术,包括预先计算的表格,特别是过度炒作的rainbow tables

一个random oracle是可以被看作是一个确定性的黑盒子一个神秘的对象:你知道的输出,你会从给定输入获得什么,除了框会一直返回相同的结果对于一个给定的输入。一个模型如下:该框包含一个侏儒,一些骰子和一本大书。侏儒使用骰子随机选择输出。他还使用本书来追踪他已发送的答案,以便保持一致,即如果输入与先前提交的输入相同,则gnome将返回与先前相同的输出,而不是掷骰子。

然而,MD5是而不是的随机预言。例如,对于具有128位输出的函数,我们可以为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的New Proofs for NMAC and HMAC: Security without Collision-Resistance血淋淋的细节)。通过使用超过$b的HMAC/SHA-256,以$secret为关键,您将从这些安全结果中受益,并且您的构建将更具有说服力。再说一遍,我并不是说在md5($b . $secret)上有一个已知的攻击,只是使用MD5 自制的MAC结构会引起红旗,这会降低可以赋予这种系统的信任级别。

1

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

+1

这几乎是唯一的选择,除了蛮力攻击。应该考虑到,现在md5哈希值可以很快计算出来,因此这种蛮力攻击不应该被低估。Bcrypt或Blowfish似乎是由真正的加密/安全专家推荐的算法(因为它们在加密方面更加安全并且可以减慢任意数量)。 – 2011-04-24 02:33:25

+1

彩虹表不会工作,因为盐(除非盐长度+密码长度小于8,这是不太可能的)。你需要暴力破解,这需要很长时间。 – Ben 2011-04-24 02:43:09

+0

,但如果你运气足以得到相同的盐:) – Sourav 2011-04-24 02:45:13

3

这是一个有趣的问题,因为在IT安全的典型场景中,您不能选择$a$b作为攻击者。例如,如果您能够获得散列密码,则已经定义了$a$b,您必须使用该密码。在这种情况下,如果有盐$b可用,您只能使用蛮力或彩虹表。

另一方面,在您的示例中,您可以自由选择两个值。你可以采取任意的秘密,例如test并相应地选择$a$b的值。我选择$ b作为empty string并用$a = md5($secret)计算$a,结果为098f6bcd4621d373cade4e832627b4f6

我选择$a = "098f6bcd4621d373cade4e832627b4f6"$b= ""并询问您是否$secret == "test"。你说的是真的,我说问题解决了。

这最终导致我们真正的答案。这两个条件给予

  • 你可以选择一个$和$ b
  • 你不知道的秘密$

不在一起工作。在我的例子中,我自己定义了$secret。我违反了第二个条件。另一方面,我不能从$secret中任意选择$a$b,因为他们可能没有解决方案。

如果我们假设至少有一种解决方案适用于所有可能的$a$b(也许有证据表明我不知道),并且您选择它们​​的方式是您真的不知道的我总是想定义$b = "",使攻击尽可能简单。在这种情况下,彩虹桌是你的朋友。