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

2022-08-30 17:44:08

我需要解密密码。密码使用功能加密。password_hash

$password = 'examplepassword';
$crypted = password_hash($password, PASSWORD_DEFAULT);

现在,让我们假设它存储在数据库中(有一个“users”表,其中包含用户名,密码等),我需要进行登录:我必须查看用户输入的密码是否与存储在数据库中的加密密码匹配。$crypted

这是 sql 代码...

$sql_script = 'select * from USERS where username="'.$username.'" and password="'.$inputpassword.'"';

...但未加密,因此它不等于存储在表用户的密码字段中的内容...$inputpassword

所以,有一个函数可以在使用后解密?还是应该更改我的加密方法?还是别的什么?password_hash


答案 1

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.';
}

在您的例子中,仅使用用户名运行 SQL 查询:

$sql_script = 'SELECT * FROM USERS WHERE username=?';

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

构造查询的方式非常危险。如果未正确参数化输入,则代码将容易受到 SQL 注入攻击。请参阅此堆栈溢出答案,了解如何防止 SQL 注入。


答案 2

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

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

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


推荐