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

PHP中使用crypt()加密密码的安全性如何?,php,encryption,password-protection,crypt,Php,Encryption,Password Protection,Crypt,我在PHP中使用crypt()加密,如下所示: <?php $password = sanitizing_func($_POST['password']); $var = crypt($password, 'ab'); ?> 这有多安全 在这里找到了更好的解决方案: 多亏了它的安全性不如只按设计的方式使用crypt,第一个参数是密码,第二个参数是salt 现在,您正在使用用户密码作为salt加密已知的明文。如果您的系统使用MD5crypt,那么您只是将salt空间限制为12个字

我在PHP中使用
crypt()
加密,如下所示:

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

这有多安全

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


多亏了

它的安全性不如只按设计的方式使用
crypt
,第一个参数是密码,第二个参数是salt

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

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

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

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


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

建议阅读-,进一步指向信息性文章,顺便说一句,你不是在清理用户输入吗?哦,是的,我这样做了,这是一个例子,我没有按原样放置POST['password']。我会读到你不应该相信用户的输入!是的,我知道我有一个无脂肪的框架来处理所有这些thing@Kumar他为什么要消毒呢?不管怎样,它都会被加密的。好吧,现在我对随机盐有点迷茫了:我怎么才能把它取回呢?我的意思是,如果盐是随机的,我如何在登录时检查它?这里不是一个常数吗?不。您的salt在密文前面加了前缀以获取返回值。对于老派的德斯克里特来说,这将是头两个角色。所以您选择两个随机字符,cryptedPass=crypt(密码,“ab”);其中“ab”是随机盐。cryptedPass返回值将以ab(随机盐)作为前缀。因此,您存储加密传递结果。然后,当用户再次键入密码时,您将获取存储的加密密码,以便获得最初使用的盐。然后用他们的输入和原始salt再次运行crypt(),与cryptedPass相比。谢谢Edward,只是出现的密码有点短,我已经习惯了md5和friends的很长字符串(我知道它们在raimbow表中是多么不安全)。。。嗯,我想相信你,我(或其他任何人)很难告诉你什么对你的申请来说“足够强大”。我最近听过的歌曲列表所在的网站的密码和我的银行对账单有着非常不同的安全要求,和在敌对领土上和间谍进行的一些编码通信相比。这就是说,DES被认为异常弱,MD5也被认为弱。你可以用SHA-256。你也可以看看哪个是bcrypt的一个实现——谢谢,这个实现了,我希望我晚上睡得更好。