这实际上是两个问题:
1)我的理解是,你通过在盐中使用多少字符来确定crypt()
使用哪种类型的加密。例如:
crypt('mypassword', someStringThatIs33CharsLong); // This would be blowfish?
2)一旦我得到这个数据,我如何在未来的日期根据用户输入验证它?下面的代码似乎不工作:
if (crypt($user_input, $encryptedinfo) == $encryptedinfo) {
echo "Password verified!";
}
我在这里错过了什么?
当您使用加密时,Salt (someStringThatIs33CharsLong)需要相同,以便您加密其他内容并具有相同的值。我已经将此用于用户名/密码登录,其中密码使用
调用crypt('password', 'aCrt45xaCrt45xaCrt45xaCrt45xaCrt4');
当你加密时,你需要使用相同的盐来确保它是相同的。这可以通过在数据库中存储或静态存储来实现。
所以你的支票会变成
if (crypt($user_input, someStringThatIs33CharsLong) == $encryptedinfo) {
echo "Password verified!";
}
要存储,您需要将$encryptedinfo
放在xml页面,sql数据库或$_COOKIE['encryptedinfo']
中(我不建议最后一个或第一个)
你应该使用:
<?php
$crypt_pass = crypt('mypassword', 'salt');
?>
和
<?php
if(crypt('mypassword', 'salt') == $crypt_pass){
echo 'Correct Pass';
}
?>
希望这对你有帮助!
PHP的crypt()
确实使用salt参数来确定使用哪种算法,但它不是参数的长度-而是格式。例如,通过以$2a$12$...
格式给出盐来选择Blowfish,其中...
是22个字符的盐。
假定$encryptedinfo
是在前面使用:
$encryptedinfo = crypt(...);
则您所展示的验证密码的方法是正确的。例如,下面的脚本打印"Password verified!"
:
$encryptedinfo = crypt('mypassword', '$2a$12$t4cmBQx3na8EAeNuWLwiN1');
if (crypt('mypassword', $encryptedinfo) == $encryptedinfo) {
echo "Password verified!'n";
}