2016-12-14 90 views
7

我使用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函数?

任何人都可以指向正确的方向吗?

+3

请阅读有关您使用的功能的文档。它会回答你的问题。 – arkascha

+1

快速参考:'一个可选的salt字符串,用于散列。如果未提供,则该行为由算法实现定义,并可能导致意外结果。# – bansi

+4

考虑使用更安全的password_hash() - https://secure.php.net/manual/en/function.password-hash。 php –

回答

1

我不知道该说些什么,这将超过其他人都已经表示,添加更多详细信息...

所以,在现代散列/ unhashing算法,这将是不安全的存储使用标准的散列密码功能(例如MD5/SHA256),因为它可以快速轻松地解决这种类型的入口。

password_hash()作为其他答案和评论中引用应该是你#1的方式来安全地存储密码,因为它使用单向散列算法

You should read this page!

然后在回应你原来的问题,使用hash_equals()功能比较密码。

6

请勿直接使用crypt来输入密码。

如果你有PHP 5.5+,比使用内置的password_hash函数,否则如果你有PHP 5.3.7+使用polyfill这个函数。

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!"; 
} 
?> 

的问题将有效地生成一个新的哈希每次它被称为时间码 - 现有的密码哈希需要作为盐通过以获得一致的结果。

如在文档中还提到:

使用password_hash()鼓励

我会进一步说你绝对应该使用password_hash而不是调用crypt密码使用的(假设PHP> = 5.5);无论如何,无论使用哪种工具/方法 - 请阅读文档以了解如何使用它们。

+0

学习上面的一个较不推荐的密码算法的完整复杂或简单地使用密码password_hash手动推荐。 – bansi

+1

@bansi'password_hash()是一个简单的crypt()包装器,并与现有的密码哈希兼容。鼓励使用password_hash()。我也鼓励使用'password_hash',但问题中的错误不是“使用错误的函数”,而是“使用函数,错误” - 或者根本不读取文档。 – AD7six

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参数的基础上散列。如果未提供,则该行为由算法实现定义,并可能导致意外的结果。

+1

您可能的意思是'$ salt',除非'salt'被定义为常量... – Leith

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

相关问题