我需要解密密码。密码使用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后有解密功能吗?或者我应该更改我的加密方法?还有什么?
答案 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";
}