我无法比较我的数据库和输入的密码

时间:2016-12-14 11:15:50

标签: php

我使用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功能?

有人能指出我正确的方向吗?

6 个答案:

答案 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()应该是您安全存储密码的第一种方式,因为它使用单向散列算法

You should read this page!

然后在回答您的原始问题时,使用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似乎是合适的。