【问题标题】:How are Crypt and Salt more secure than MD5 against a brute force attack?Crypt 和 Salt 如何比 MD5 更安全地抵御暴力攻击?
【发布时间】:2011-12-27 15:45:21
【问题描述】:

我在 PHP.net 上看到 MD5 没用,他们建议使用 crypt + salt。

所以,我去他们的功能描述阅读

<?php
$password = crypt('mypassword'); // let the salt be automatically generated

/* You should pass the entire results of crypt() as the salt for comparing a
   password, to avoid problems when different hashing algorithms are used. (As
   it says above, standard DES-based password hashing uses a 2-character salt,
   but MD5-based hashing uses 12.) */
if (crypt($user_input, $password) == $password) {
   echo "Password verified!";
}
?>

或者在我的情况下是这样的:

$stored_password=fetch_password($user);
if (crypt($_REQUEST['password'],$stored_password)===$stored_password) {
// ok
}

所以,当我看到盐存储在散列密码中并且您将该散列密码用作盐时,我认为 Crypt + Salt 对于输出的暴力破解并不更安全(设法窃取散列密码的黑客)。是否更安全?

对于字典攻击,我可以理解它的威力,但对于散列密码的暴力攻击,我看不到优势。

【问题讨论】:

    标签: php md5 crypt


    【解决方案1】:

    在散列之前将盐应用于字符串(示例中的密码)时,散列现在变成另一个散列,而不是没有盐的情况。 没有盐,你可以只使用一个预先存在的字典——现在你需要为盐创建一个字典。如果您使用用户特定的盐,则每个用户在使用蛮力时都需要拥有自己的字典。这变得更加耗时。

    MD5 是一个损坏的算法,因为它的collision vulnerabilities

    【讨论】:

      【解决方案2】:

      哈希加密比 MD5 更昂贵。攻击者需要更多的计算时间,因此更安全。

      对于密码和 MD5,攻击者可以使用 MD5 的预计算表加上 MD5 速度非常快的优势。

      对于密码和加盐 crypt,预先计算的表格将毫无用处,PLUS crypt 需要比 MD5 更多的马力

      有一些特制的算法 (google bcrypt),它们有意提高计算成本以进一步实现这一目标。

      【讨论】:

        【解决方案3】:

        盐通过使您的散列密码唯一而阻碍彩虹表和散列字典。

        它们还有助于防止有人窃取您的散列密码列表并使用它来访问不同站点上的帐户(通过反转散列或类似方法)。

        它无助于对抗传统的蛮力攻击。

        【讨论】:

        • 盐有助于抵御传统的暴力攻击,因为黑客必须建立一个适应盐的字典。如果使用用户唯一的盐,那么每个用户都必须有自己的字典。
        • 字典不用于传统的暴力攻击。