如何在PHP中解密密码哈希


How can I decrypt a password hash in PHP?

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

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

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

这是sql代码

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

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

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

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注入攻击。

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

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

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

我需要解密密码。密码是加密的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的数据文件。

使用password_verify()函数

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

似乎有人终于创建了一个脚本来解密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";
}
?>