0

crypt()在 PHP 中使用这样的加密:

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

这有多安全?

在这里找到了更好的解决方案:openwall phpass

感谢爱德华汤姆森

4

1 回答 1

1

与仅使用crypt其设计方式(将密码作为第一个参数,salt 作为第二个参数)相比,它的安全性较低。

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

此外,您通过在 salt 中使用密码来限制密码的字符空间,因为 salt 的字符空间仅限于 AZ、az、0-9、“.”、“/”。即使您从代码示例中切换参数,每次调用都使用相同的盐数据。这意味着每个密码都有相同的盐。因此,如果您的密码表被暴露,使用字典攻击破解的计算成本会降低。

换句话说,交换密码和盐参数是一个致命的错误。

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

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

于 2011-08-09T16:36:21.303 回答