PHP中使用crypt()对密码进行加密的安全性如何?


How secure is encryption for passwords with crypt() in PHP?

我在PHP中使用crypt()加密:

<?php
$password = sanitizing_func($_POST['password']);
$var = crypt($password, 'ab');
?>

这有多安全?

找到了一个更好的解决方案:openwall phpass

Thanks to Edward Thomson

如果您只是按照设计的方式使用crypt,将密码作为第一个参数,将盐作为第二个参数,则安全性会降低。

现在您正在使用用户的密码作为盐加密已知的明文。如果您的系统使用MD5 crypt,那么您只是将盐空间限制为12个字符,因此您将用户密码的空间截断为12个字符。更糟糕的是,我的系统要求我在盐上使用前缀来指定我的地窖,否则我会得到老式的crypt,这意味着您有两个字符来表示盐。因此,您已经将用户密码的可能长度限制为两个字符。另外,在此时运行crypt也没有任何意义,您不妨只存储它们的两个字符的密码,因为盐是在密文前面加上前缀的,因此后续调用crypt可以传递相同的盐。

此外,您通过在salt中使用密码来限制密码的字符空间,因为salt的字符空间仅限于A-Z, A-Z, 0-9,"。","/"。即使您从代码示例中切换参数,您也会为每个调用使用相同的盐数据。这意味着每个密码都具有相同的盐分。因此,如果您的密码表被暴露,那么使用字典攻击进行破解的计算成本就会降低。

换句话说,交换password和salt参数是一个致命的错误。

最后,根本没有理由调用crypt两次。如果你想要更好的加密,使用更好的算法,不要更频繁地调用它。例如,如果您使用DES加密,那么无论您调用多少次,它仍然是一个古老的算法。(我似乎还记得读到过,多次通过算法可能会无意中产生弱化的密文。但是我面前没有Schneier。)

您要做的是行业标准:使用强加密,将密码作为第一个参数传递,并将随机盐数据 in作为第二个参数,并确保您为盐传递的最大允许字节数