将php寄存器脚本从Sha1转换为Bcrypt

将php寄存器脚本从Sha1转换为Bcrypt,php,sha1,bcrypt,php-password-hash,Php,Sha1,Bcrypt,Php Password Hash,因此,我有一个旧网站的密码检查定义为: if($i['password'] == hash('PASSWORD_BCRYPT',$p.$i['salt']) || sha1($p) == $i['password']) { 它使用以下命令从数据库中选择数据 $u = $mysqli->real_escape_string($_REQUEST['username']); $p = $_REQUEST['password']; $s = $mysqli->query("SELECT *

因此,我有一个旧网站的密码检查定义为:

if($i['password'] == hash('PASSWORD_BCRYPT',$p.$i['salt']) || sha1($p) == $i['password']) {
它使用以下命令从数据库中选择数据

$u = $mysqli->real_escape_string($_REQUEST['username']);
$p = $_REQUEST['password'];
$s = $mysqli->query("SELECT * FROM `accounts` WHERE `name`='".$u."'") or die();
$i = $s->fetch_assoc();
我知道Sha1从来没有被用于密码加密,而是为了获得更快的处理速度,所以我想迁移到BCrypt。尽管做了无数次尝试,我似乎还是没能让它发挥作用。(很抱歉仍在学习php)到目前为止,我得到的是:

$options = [ 'cost' => 12];
if($i['password'] == password_hash($p.$i['salt'], PASSWORD_BCRYPT, $options) || password_hash($p, PASSWORD_BCRYPT, $options) == $i['password']){

我的登录脚本不允许继续登录,因此定义、提供和检索的密码不匹配。我知道bcrypt被正确地存储为我的java应用程序,由bcrypt.hashpw(pass,bcrypt.gensalt(12))定义;能正确读写。那么为什么网站不能呢?

你应该使用password\u verify函数来验证密码散列

在验证用户时,通常最好去掉任何短路逻辑(例如| |运算符和
=
字符串比较),以防止定时攻击。这里可能不太重要,但肯定是一个很好的维护实践。请参阅副本,以获取一个示例
密码\u hash()
生成自己的安全salt,不需要附加您自己的安全salt。我在我认为可能是什么的下面回答了这个问题?我可能错了。很抱歉那么像这样:如果(password_verify($i['password',$p))?我相信$I['password']是用户输入的,若我并没有错,$p从数据库中提取。这实际上不起作用,所以我不完全确定它在哪里搞砸了