功能是:
$a == md5($b . $secret);
有没有比蛮力更好的攻击来找到一般的$ secret? 有没有比使用PHP's md5 function蛮力找到$ secret更好的攻击?
从我在网上发现的内容我认为没有,尽管md5在其他一些用例中已被弃用。所以只是为了确定......
亲切的问候
答案 0 :(得分:3)
这是一个有趣的问题,因为在IT安全的典型情况下,您无法选择$a
和$b
作为攻击者。例如,如果您能够获得哈希密码,则$a
和$b
已经定义,您必须使用它。在这种情况下,只有使用盐$b
的人才能使用暴力或彩虹表。
另一方面,在您的示例中,您可以自由选择这两个值。你可以采取任意秘密,例如test
并相应地选择$a
和$b
的值。我选择$ b为empty string
并使用$a
计算$a = md5($secret)
,结果为098f6bcd4621d373cade4e832627b4f6
。
我选择$a = "098f6bcd4621d373cade4e832627b4f6"
和$b= ""
,并询问您是否$secret == "test"
。你说的是真的,我说问题已经解决了。
这最终引导我们得到真正的答案。给出的两个条件
不要一起工作。在我的例子中,我自己定义了$secret
。我违反了第二个条件。另一方面,我不能任意选择$a
和$b
而不从$secret
派生,因为他们可能没有解决方案。
如果我们假设所有可能的$a
和$b
对都有至少一个解决方案(可能有证据证明,我不知道),你在你真的不知道$secret
的方式,我总是想定义$b = ""
,以使攻击尽可能简单。在这种情况下,彩虹桌是你的朋友。
答案 1 :(得分:3)
如果MD5的行为像一个随机的oracle(这是一个很大的“if”,见下文),那么$secret
上的详尽搜索是最好的攻击 - 更重要的是,每次“猜测”值$secret
必须对函数使用查询(因为您使用PHP,我假设该函数是在Web服务器中实现的,并且每个“查询”都需要与该服务器通信)。后者是由于缺少发回给攻击者的信息而暗示的:攻击者除了一个比特(“True
”或“False
”结果外没有得到任何东西。特别是,他自己没有获得MD5输出。攻击者将获得大量无信息的“False
”结果,除非他击中正确的MD5输出,或者是纯粹的机会(概率2 -128 ,这真的很小),或者因为他事先正确地猜到了$secret
的价值。值得注意的是,这可以防止攻击者使用许多成本分摊技术,包括预先计算的表,特别是过度炒作的rainbow tables。
random oracle是一个神话般的对象,可以被视为一个确定性的黑盒子:你知道输出的没有你将从给定的输入中获得,除了盒子将永远返回给定输入的相同结果。模型如下:该框包含一个侏儒,一些骰子和一本大书。 gnome使用骰子随机选择输出。他还使用该书来跟踪他已发送的答案,以便保持一致,即如果输入与先前提交的输入相同,则gnome将返回与之前相同的输出而不是投掷骰子。
但是,MD5 不是一个随机的oracle。例如,对于具有128位输出的函数,我们可以比MD2的理论2 64 电阻更快地构建MD5的碰撞。另外,请注意,作为一个好的哈希函数(防碰撞等)并不一定需要“随机 - 神奇”。例如,SHA-256被认为是一个安全的哈希函数,但它仍然遭受所谓的“长度扩展攻击”(给定SHA256($a)
,可以在不知道的情况下计算SHA256($a . $b)
{ {1}},几乎任意值$a
)。所以随机oracle的保证不适用于MD5(或者就此而言,SHA-256)。这并不意味着已知更快的攻击!只有你自己在这里。
还可以指出$b
是一种“键控哈希”,即MAC(消息认证码)。使用散列函数构建MAC并不容易,正是因为长度扩展攻击(例如md5($b . $secret)
)会导致MAC很差。设计了一种利用散列函数构建MAC的强大方法;它被称为HMAC并涉及对底层哈希函数的两次调用(但其中一个是短输入,所以这仍然是有效的)。 HMAC的安全性,更确切地说HMAC如何被视为随机oracle,可以被“证明”,即简化为一些散列函数内部属性,在SHA-256的情况下也是如此(参见New Proofs for NMAC and HMAC: Security without Collision-Resistance由Mihir Bellare为血淋淋的细节)。通过md5($secret . $b)
使用HMAC / SHA-256,以$b
为关键,您将从这些安全结果中受益,并且您的构造将更加令人信服。再说一次,我并没有声称$secret
存在已知的攻击,只是使用MD5 和自制的MAC结构都会引发红旗,这会降低信任度。可以传授给这样一个系统。
答案 2 :(得分:1)
下载着名密码的彩虹表/密码哈希! :)