函数是:
$a == md5($b . $secret);
- 您可以选择 $a 和 $b。
- 您不知道 $secret。
- 您选择的 $a 和 $b 的函数值为 true 或 false。
一般情况下,是否有比暴力破解更好的方法来查找 $secret?
使用 PHP 的 md5 函数,是否有比暴力破解更好的方法来查找 $secret?
从我在网上找到的资料来看,我认为没有,尽管 md5 已经被弃用于某些其他用例。所以只是为了确保一下...
此致敬礼
函数是:
$a == md5($b . $secret);
一般情况下,是否有比暴力破解更好的方法来查找 $secret?
使用 PHP 的 md5 函数,是否有比暴力破解更好的方法来查找 $secret?
从我在网上找到的资料来看,我认为没有,尽管 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构造引发了警觉,这降低了可以赋予此类系统的信任级别。下载一个彩虹表/著名密码的密码哈希值!:)