密码验证不适用于密码哈希 BCRYPT
Password verify not working with password hash BCRYPT
我目前正在 PHP 登录,密码在另一个文件上使用 password_hash('password',PASSWORD_BCRYPT)
加密,我实际上是从 mySQL 检索数据,并从 mySQL 获取数据一个 AJAX 调用,但我已经声明了变量来显示我的问题:
<?php
require "modulos/conexion.php";
session_start();
if (!isset($_SESSION['username']) && !isset($_SESSION['userid'])) {
$usuario = "mariano overs";
$pass = "1234";
$passdb = 'y$A1nr4od4OjP0N1hNoB9Seur3OsWzU3ufT4G82XNTLV3'; // equivalent of password_hash('1234',PASSWORD_BCRYPT), this is value from DB
$sql = 'SELECT id_usua, co_usua, ds_pass FROM dbfar_cabusuarios WHERE co_usua="' . $usuario . '" LIMIT 1';
if ($res = mysqli_query($GLOBALS['conexion'],$sql)) {
if (mysqli_num_rows($res) == 1) {
$usuario = mysqli_fetch_array($res, MYSQLI_ASSOC);
echo "Contrasena guardada: ". $pass . "<br />Contrasena de la base: " . $usuario['ds_pass'] . "<br />";
if (password_verify($pass, $passdb)){
$_SESSION['username'] = $usuario['co_usua'];
$_SESSION['userid'] = $usuario['id_usua'];
echo "INICIO SESION CORRECTAMENTE";
}
else{
echo "INICIO SESION NO CORRECTO";
}
} else {
echo "REGISTROS NO CORRECTOS";
}
} else {
echo "USUARIO NO EXISTE";
}
}
因为我知道我从数据库中得到了正确的值,问题不在于那里,而是在 password_verify 函数上。它们没有得到正确验证。我需要在 password_verify
中添加其他值吗?
哈希密码包含 60-72 个字符长的字符串。
该列需要足够长才能容纳散列。
说明书建议255,以备后用。
您需要重新开始并修改您的专栏以使其足够长。
这样做,存储一个新的散列并重新开始。
60 个字符:(来自手册)
y$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
你有一个 50 长:(你去;太短)
y$A1nr4od4OjP0N1hNoB9Seur3OsWzU3ufT4G82XNTLV3
这告诉我它被截断了。
手册指出:
注意
使用 PASSWORD_BCRYPT 作为算法,将导致密码参数被截断为最大长度 72 个字符。
参考:
作为额外奖励:
您的代码容易受到 SQL 注入。最好使用准备好的语句。
- https://en.wikipedia.org/wiki/Prepared_statement
- How can I prevent SQL injection in PHP?
我目前正在 PHP 登录,密码在另一个文件上使用 password_hash('password',PASSWORD_BCRYPT)
加密,我实际上是从 mySQL 检索数据,并从 mySQL 获取数据一个 AJAX 调用,但我已经声明了变量来显示我的问题:
<?php
require "modulos/conexion.php";
session_start();
if (!isset($_SESSION['username']) && !isset($_SESSION['userid'])) {
$usuario = "mariano overs";
$pass = "1234";
$passdb = 'y$A1nr4od4OjP0N1hNoB9Seur3OsWzU3ufT4G82XNTLV3'; // equivalent of password_hash('1234',PASSWORD_BCRYPT), this is value from DB
$sql = 'SELECT id_usua, co_usua, ds_pass FROM dbfar_cabusuarios WHERE co_usua="' . $usuario . '" LIMIT 1';
if ($res = mysqli_query($GLOBALS['conexion'],$sql)) {
if (mysqli_num_rows($res) == 1) {
$usuario = mysqli_fetch_array($res, MYSQLI_ASSOC);
echo "Contrasena guardada: ". $pass . "<br />Contrasena de la base: " . $usuario['ds_pass'] . "<br />";
if (password_verify($pass, $passdb)){
$_SESSION['username'] = $usuario['co_usua'];
$_SESSION['userid'] = $usuario['id_usua'];
echo "INICIO SESION CORRECTAMENTE";
}
else{
echo "INICIO SESION NO CORRECTO";
}
} else {
echo "REGISTROS NO CORRECTOS";
}
} else {
echo "USUARIO NO EXISTE";
}
}
因为我知道我从数据库中得到了正确的值,问题不在于那里,而是在 password_verify 函数上。它们没有得到正确验证。我需要在 password_verify
中添加其他值吗?
哈希密码包含 60-72 个字符长的字符串。
该列需要足够长才能容纳散列。
说明书建议255,以备后用。
您需要重新开始并修改您的专栏以使其足够长。
这样做,存储一个新的散列并重新开始。
60 个字符:(来自手册)
y$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
你有一个 50 长:(你去;太短)
y$A1nr4od4OjP0N1hNoB9Seur3OsWzU3ufT4G82XNTLV3
这告诉我它被截断了。
手册指出:
注意
使用 PASSWORD_BCRYPT 作为算法,将导致密码参数被截断为最大长度 72 个字符。
参考:
作为额外奖励:
您的代码容易受到 SQL 注入。最好使用准备好的语句。
- https://en.wikipedia.org/wiki/Prepared_statement
- How can I prevent SQL injection in PHP?