【问题标题】:password verify not working to compare hashed password with user entered password密码验证无法将散列密码与用户输入的密码进行比较
【发布时间】:2016-12-11 20:02:03
【问题描述】:

我正在尝试将散列密码与用户输入的密码进行比较,但它没有验证并显示密码不正确。我用这段代码来哈希密码:$hashed_password = password_hash($me, PASSWORD_DEFAULT);

下面的代码是登录检查页面

host=""; // Host name 
$username=""; // Mysql username 
$password=""; // Mysql password 
$db_name=""; // Database name 
$tbll_name="employees_table"; // Table name 
$tb2_name="system_users";
$tb3_name="managers_table";
// Connect to server and select databse.
$link = mysqli_connect("$host", "$username", "$password")or die("cannot connect"); 
mysqli_select_db($link,"$db_name")or die("cannot select DB");
$myusername=$_POST["myusername"];  
$mypassword=$_POST["mypassword"]; 

// To protect MySQL injection (more detail about MySQL injection )
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysqli_real_escape_string($link, $myusername);
$mypassword = mysqli_real_escape_string($link, $mypassword);


$statues = "active";

// from system table
if ($sql="SELECT * FROM $tb2_name WHERE User_id='".$myusername."' and statues='".$statues."'");
{

$wql="SELECT * FROM $tb2_name WHERE User_id='".$myusername."' ";
$result2 = mysqli_query($link, $wql);
$details = mysqli_fetch_array($result2, MYSQLI_BOTH);
$Name = $details["Company"];
$Surname = $details["First_name"];
$encrypted_password = $details["Password"];

上面的代码从数据库中获取散列函数,下面的代码比较它们。但它显示密码不正确,即使我输入了正确的密码

if (password_verify($mypassword, $encrypted_password))
{ 

【问题讨论】:

  • 你的数据库怎么样,你能向我们展示你的表结构吗?
  • @Jerome 请考虑删除此问题
  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 不要使用手动转义和字符串插值或连接来完成此操作,因为如果您忘记正确转义某些内容,您将创建严重的SQL injection bugsstripslashes 不应使用,尤其是密码。
  • 警告:编写自己的访问控制层并不容易,而且有很多机会会严重错误。当任何现代的development framework(如Laravel)带有强大的authentication system 内置时,请不要编写自己的身份验证系统。

标签: php mysql hash


【解决方案1】:

“我认为散列密码大于 30 个字符,所以它会在 30 个字符后被删除。——杰罗姆”

您的查询“悄悄地”失败了,因为密码列(曾经)太短,您需要清除当前密码/哈希值并重新开始。

根据password_hash()函数的手册:

http://php.net/manual/en/function.password-hash.php

PASSWORD_DEFAULT - 使用 bcrypt 算法(自 PHP 5.5.0 起默认)。请注意,此常量旨在随着 PHP 中添加新的和更强大的算法而随时间而变化。因此,使用此标识符的结果长度可能会随时间而变化。因此,建议将结果存储在可以扩展超过 60 个字符的数据库列中(255 个字符将是一个不错的选择)。

【讨论】:

  • 为什么人们总是在列大小上占便宜? VARCHAR(255)VARCHAR(60) 在内部具有相同的成本,但较短的成本通常会默默地截断数据并导致大量头痛。这不值得。
【解决方案2】:

将 if 语句更改为

if (password_verify($mypassword, $encrypted_password))
{ 

你有错误的方式变量和 $encrypt 没有声明

【讨论】:

    猜你喜欢
    • 2016-01-27
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多