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

时间:2014-06-03 20:51:40

标签: php mysql encryption

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

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

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

这是sql代码......

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

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

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

5 个答案:

答案 0 :(得分:21)

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="'.$username.'"';

使用与上述示例类似的代码在PHP中进行密码验证。

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

答案 1 :(得分:1)

  

我需要解密密码。密码用密码加密   password_hash函数。

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

如果您需要password_verify,或者您尝试未经授权访问应用程序或数据库,我不清楚。其他人已经谈过password_verify,所以这里是你如何获得未经授权的访问。这是坏人在试图访问系统时经常做的事情。

首先,创建纯文本密码列表。由于Adobe等公司的大规模数据泄露,可以在许多地方找到纯文本列表。对列表进行排序,然后选择前10,000或100,000左右。

其次,创建一个消化密码列表。只需加密或散列密码即可。根据您的上述代码,它看起来不像正在使用的盐(或它的固定盐)。这使攻击非常容易。

第三,对于列表中的每个消化密码,执行选择以尝试查找使用密码的用户:

$sql_script = 'select * from USERS where password="'.$digested_password.'"'
第四,利润。

因此,坏人不是挑选用户并尝试撤销他们的密码,而是选择一个通用密码并尝试找到正在使用它的用户。赔率在坏人身上......

因为坏人做了这些事情,所以你可以选择 而不是 让用户选择常用密码。在这种情况下,请查看ProCheck,EnFilter或Hyppocrates(等)。他们正在过滤拒绝错误密码的库。 ProCheck实现了非常高的压缩,可以将数百万字的密码列表消化为30KB的数据文件。

答案 2 :(得分:0)

似乎有人终于创建了一个解密password_hash的脚本。 结帐这个:https://pastebin.com/Sn19ShVX

<?php
error_reporting(0);

# Coded by L0c4lh34rtz - IndoXploit

# \n -> linux
# \r\n -> windows
$list = explode("\n", file_get_contents($argv[1])); # change \n to \r\n if you're using windows
# ------------------- #

$hash = '$2y$10$BxO1iVD3HYjVO83NJ58VgeM4wNc7gd3gpggEV8OoHzB1dOCThBpb6'; # hash here, NB: use single quote (') , don't use double quote (")

if(isset($argv[1])) {
    foreach($list as $wordlist) {
        print " [+]"; print (password_verify($wordlist, $hash)) ? "$hash -> $wordlist (OK)\n" : "$hash -> $wordlist (SALAH)\n";
    }
} else {
    print "usage: php ".$argv[0]." wordlist.txt\n";
}
?>

答案 3 :(得分:0)

密码无法解密,因为这会对用户造成漏洞。因此,您只需使用password_verify()方法来比较密码。

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

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

答案 4 :(得分:0)

使用password_verify()函数

if (password_vertify($inputpassword, $row['password'])) {
  print "Logged in";
else {
    print "Password Incorrect";
}