我使用php crypt
函数来确保密码安全,但是当我尝试将输入的密码与数据库中的密码进行比较时,它将无法正常工作。
这是我首先创建密码的代码:
$crypt_password = crypt($_POST['confirm-password']);
这是我试图与另一个函数中的密码进行比较:
$input_crypt_password = crypt($_POST['input-pw']);
if ($input_crypt_password == $dbpassword){
// do change password function
}
这不起作用。
当我打印两个密码时,它们是不同的。
为什么密码不同,即使我输入相同的密码并在两者上使用crypt功能?
有人能指出我正确的方向吗?
答案 0 :(得分:13)
来自the docs
示例#1 crypt()示例
<?php $hashed_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 (hash_equals($hashed_password, crypt($user_input, $hashed_password))) { echo "Password verified!"; } ?>
问题中的代码每次调用时都会生成一个新的哈希值 - 现有的密码哈希需要作为salt传递,以获得一致的结果。
正如文档中所述:
鼓励使用password_hash()。
我会更进一步说你绝对应该使用password_hash
而不是调用crypt
密码使用(假设php&gt; = 5.5);无论如何,无论您使用哪种工具/方法,请阅读文档以了解如何使用它们。
答案 1 :(得分:6)
请勿直接使用crypt
作为密码。
如果您使用PHP 5.5+,请使用内置的password_hash
函数,否则如果您使用PHP 5.3.7+,请使用polyfill来执行此功能。
答案 2 :(得分:2)
尝试这样的事情。
$crypt_password = crypt($_POST['confirm-password'],salt);
$input_crypt_password = crypt($_POST['input-pw'],salt);
if ($input_crypt_password == $dbpassword){
// do change password function
echo "Password match successfully!";
}
这里以salt
参数为基础进行散列。如果未提供,则行为由算法实现定义,并可能导致意外结果。
答案 3 :(得分:1)
我不知道该怎么说会增加比其他人已经说过的更多细节...
因此,在现代哈希/解散算法中,使用标准散列函数(例如MD5 / SHA256)存储密码是不安全的,因为它可以快速轻松地取消此类条目。
其他答案和评论中提到的 password_hash()
应该是您安全存储密码的第一种方式,因为它使用单向散列算法。
然后在回答您的原始问题时,使用hash_equals()
功能来比较密码。
答案 4 :(得分:0)
正如这里的许多人所说,你应该使用password_hash php函数。
在这里您可以看到一个如何使用它的简单示例:
<?php
$password = '123456';
$userInput = '123456';
$storedHash = password_hash($password, PASSWORD_DEFAULT);
if (password_verify($userInput, $storedHash)) {
echo 'OK';
} else {
echo 'ERROR';
}
同样如前所述,如果您使用旧版本的PHP,则可以安装polyfill。
答案 5 :(得分:0)
在保存数据库和进行比较之前,您是否修剪了输入?由于输入来自浏览器,这可能是它不匹配的原因。否则这https://stackoverflow.com/a/41141338/1748066似乎是合适的。