如何在PHP中解密密码哈希?

dar*_*odp 12 php mysql encryption

我需要解密密码.使用password_hash函数加密密码.

$password = 'examplepassword';
$crypted = password_hash($password, PASSWORD_DEFAULT);
Run Code Online (Sandbox Code Playgroud)

现在,让我们假设$加密后存储在数据库中(有一个"用户"表,其中用户名,密码等),我需要做一个登录:我必须看到,如果由用户输入的密码与加密的密码存储在数据库中.

这是sql代码......

$sql_script = 'select * from USERS where username="'.$username.'" and password="'.$inputpassword.'"';
Run Code Online (Sandbox Code Playgroud)

...但是$ inputpassword没有加密,所以它不等于表用户的密码字段中存储的内容......

那么,有一个使用password_hash后解密的功能?或者我应该更改我的加密方法?还有什么?

Ger*_*osi 23

Bcrypt是一种单向散列算法,你不能解密哈希.使用password_verify检查密码是否与存储的哈希匹配:

<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>
Run Code Online (Sandbox Code Playgroud)

在您的情况下,仅使用用户名运行SQL查询:

$sql_script = 'select * from USERS where username="'.$username.'"';
Run Code Online (Sandbox Code Playgroud)

并使用类似于上面示例的代码在PHP中进行密码验证.

编辑:以这种方式构建查询非常危险.如果您没有正确地转义输入,代码将容易受到SQL注入攻击.请参阅 SO答案,了解如何防止SQL注入.

  • 你认为你遇到了严重的麻烦。为了理智,那应该是`username=?`。 (2认同)

小智 5

密码无法解密,因为这会给用户带来漏洞。所以,你可以简单地使用password_verify()方法来比较密码。

if(password_verify($upass, $userRow['user_pass'])){
     //code for redirecting to login screen }
Run Code Online (Sandbox Code Playgroud)

其中,$upass是用户输入的密码,$userRow['user_pass']是数据库中经过password_hash()函数加密的user_pass字段。