当前位置: 首页 > 知识库问答 >
问题:

如何根据数据库验证密码?

孔山
2023-03-14

我看了很多与这个主题相关的文章,比如这个:

使用PHP5.5的密码\u散列和密码\u验证函数

然而,我不确定我是用正确的方法还是过度的方法来做!

我想用我自己的盐,然后散列。盐和散列密码两者都存储在数据库的两个不同字段中。

这就是我在存储到数据库之前如何散列密码的方法

$cost = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$salt = sprintf("$2a$%02d$", $cost) . $salt;

//shall I remove this line and replace below PASSWORD_DEFAULT  with PASSWORD_BCRYPT instead?
$password = crypt($data['password'], $salt);

$hash = password_hash($password, PASSWORD_DEFAULT);

有鉴于此,我正试图验证密码,如下所示:不知何故,我觉得我使过程复杂化了。

$salt=$row['salt'];//taken from db
$hashAndSalt=$row['hashpword'];//taken from db
$password="pwtester";//user keyed in password

$newpassword = crypt($password, $salt);
$newhash = password_hash($newpassword, PASSWORD_DEFAULT);


if (password_verify($password, $newhash)) {
   echo"verified";
}
else
{
    echo"Not verified"; 
}

编辑:

现在我这样储存:

$cost = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$options = array('cost' => $cost,'salt' => $salt);
$hash = password_hash($data['password'], PASSWORD_DEFAULT,$options);

但是验证令人困惑:

$email = "test55@gmail.com";
$uid= '555ca83664caf';
$sql = "SELECT *FROM authsessions WHERE email =:myemail AND useruuid =:uid";

$statement = $pdo->prepare($sql);
$statement->bindValue(':myemail', $email);
$statement->bindValue(':uid', $uid);
$statement->execute();
while( $row = $statement->fetch()) {
    echo "salt ".$row['salt']."<br/><br/>";
    echo "hashpassword ".$row['hashpword'];
}

$salt=$row['salt'];
$hashAndSalt=$row['hashpword'];
$password="test55";

$newhash = password_hash($password+$salt, PASSWORD_DEFAULT);


if (password_verify($newhash, $hashAndSalt)) {
   echo"verified";
}
else
{
    echo"Not verified"; 
}

它呼应“未验证”

共有3个答案

全冥夜
2023-03-14

密码存储

$cost = 10;

$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');

$options = array('cost' => $cost,'salt' => $salt); 

$hash = password_hash($data['password'], PASSWORD_DEFAULT,$options);

密码验证:

<?php
include('config.php');
$email = "test55@gmail.com";
$uid= '555cb0a63f08d';
$sql = "SELECT *FROM authsessions WHERE  useruuid =:uid";

$statement = $pdo->prepare($sql);
$statement->bindValue(':uid', $uid);
$statement->execute();
while( $row = $statement->fetch()) {
echo "salt ".$salt=$row['salt']."<br/><br/>";
echo "hashpassword ".$hashAndSalt=$row['hashpword'];
echo"<br/>";
}

$password="nony";



//$newhash = password_hash($password+$salt, PASSWORD_DEFAULT);


if (password_verify($password, $hashAndSalt)) {
   echo"verified";
}
else
{
echo"Not verified"; 
}
?>
田慈
2023-03-14

这将正确地进行验证。

//on creating an account, a user enters a password!
$password="pwtester";//user keyed in password

$newhash = password_hash($password, PASSWORD_DEFAULT);
//#newhash now has the only value that you need to store in the db
//you do not need any more than this value, that you retrieve when you 
//want to verify your password!

//this part is only done to verify passwords!
if (password_verify($password, $newhash)) {
    echo"verified";
}
else
{
    echo"Not verified"; 
}

因此,前提是您已将哈希存储在数据库中

$newhash=$row['hashpword'];//taken from db
$password="pwtester";//user keyed in password

if (password_verify($password, $newhash)) {
    echo"verified";
}
else
{
    echo"Not verified"; 
}

应该有用!

云焱
2023-03-14

函数password_hash()只是一个包装器,它在内部生成一个密码安全的盐,然后调用Crypt()函数来计算BCrypt哈希。

因此,没有理由自己执行相同的步骤(不要调用crypt(),也不要生成salt)。不建议生成您自己的salt,因为您不能比password\u散列函数做得更好。此外,也没有理由将salt存储在单独的db列中,它已经是结果哈希值的一部分。

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
 类似资料:
  • 主要内容:验证数据库是否具有限制性,配置数据库管理器和数据库,数据库配置参数运行 命令后,可以使用以下命令检查是否已创建数据库: 验证数据库是否具有限制性 通过使用上述命令,只能检查数据库列表。无法确定数据库是限制性的还是非限制性的。 使用以下命令检查数据库是否具有限制性。 语法: 示例: 假设要检查 数据库是否是限制性数据库: 得到类似以下结果: 可以看到它不是限制性的。现在检查是否是限制性数据库: 得到类似以下结果: 可以看到 是限制性数据库。 配置数据库管理器和数据

  • 我已经开始开发一个由Google的Firebase服务提供支持的应用程序。我很好奇数据传输在Auth和数据库服务中是否安全。如果没有,我是否可以阅读任何材料来源以实现加密? 非常感谢。

  • 据我所知,有一些方法可以根据RDF模式验证序列化的RDF(例如RDF/XML)(如何用您的RDF模式验证RDF)。还有,从RDF/XML到JSON-LD序列化格式的各种转换器(反之亦然)。在Internet上搜索,我找不到一种直接的方法来验证JSON-LD与某种JSON模式的关系,就像RDF模式与RDF(/XML)的关系一样。当然,有各种各样的JSON-LD文档表单,所以我假设一个模式不能很容易地

  • 我正在玩一个桌面应用程序的登录/注册系统。我有一个注册表单和登录表单,凭证信息保存到PostgreSQL数据库中。我一开始没有加密信息,一切正常,但现在我想加密密码以保存到数据库。我正在使用Jasypt并获得了加密密码并保存到数据库: 这工作得很好,我的密码是加密的。我困惑于从哪里开始从数据库中获取密码,以便将加密的密码与用户输入进行比较。我在比较密码的表格中的签名(在加密密码之前): 我做了一个

  • 我有一个来自idp的saml响应,它在响应和断言中都有签名。我正在尝试使用X509证书公钥验证签名。这是我的代码 我尝试了多个saml响应,不仅仅是我的。但我得到一个错误说: 警告org.apache.xml.security.signature。XMLSignature-签名验证失败。org.opensaml.xml.validation。ValidationException:签名未根据凭据的

  • 问题内容: 如何检查Hibernate映射配置是否与数据库匹配?我想知道在开始执行更新和查询之前是否使用了错误版本的hibernate映射,否则将失败。 我有一堆已经用Hibernate注释映射的类。我也有到相应数据库的连接。现在,我想检查Hibernate映射是否与数据库匹配。 我想至少检查以下几件事: Hibernate配置中的所有映射表在数据库中都有对应的对象(例如表或视图) 所有映射的字段

  • 编写验证器 验证器是一个可调用的对象,它接受一个值,并在不符合一些规则时抛出ValidationError异常。验证器有助于在不同类型的字段之间重复使用验证逻辑。 例如,这个验证器只允许偶数: from django.core.exceptions import ValidationError def validate_even(value): if value % 2 != 0:

  • 简介 Lumen 提供了数种不同的方法来验证传入应用程序的数据。默认情况下,Lumen 的基控制器类使用名为 ProvidesConvenienceMethods 的 trait,其提供了一种便捷的方法来使用各种强大的验证规则验证传入的 HTTP 请求。 一般来说,Lumen 中的数据验证与 Laravel 中的数据验证并无多大区别,因此你应该查阅 完整的 Laravel 数据验证文档 以熟悉其使