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

比较密码\u哈希为一个密码生成的两个哈希

岳英耀
2023-03-14

所以,我将用户密码通过password_hash()散列(PHP5.5)后存储在数据库中。然后在使用密码_verify()登录时验证用户。但现在我还想用cookies在用户浏览器上存储密码。我使用password\u散列对相同的密码进行散列,但这次散列的第二部分明显不同。(盐)

因此,两个哈希(数据库中的一个和cookie中的一个)不相等。那么我如何验证它们呢???

共有2个答案

查宜修
2023-03-14

在cookie上存储用户凭证是高风险的。

若您在数据库中存储哈希密码,所以只需要传递用户名和密码,那个么将从其他文件中哈希并将其匹配到您的数据库中。

例如登录。php post用户名和密码

usercheck.phpmd5(密码)并将其检查到已经散列密码的数据库中

公良弘毅
2023-03-14

你想做的是重建会话。我建议你简单地使用会话。

如果出于任何原因不能,则生成一个随机字符串(使用类似于random\u compat的库)。

$token = random_bytes(16);

字符串存储在数据库中:

INSERT INTO user_to_token (user_id, token) VALUES (?, ?)

但是,存储哈希,这样,如果数据库泄漏,攻击者将不知道原始令牌,因此无法窃取会话。

$query->execute([$userId, hash('sha256', $token)]);

然后,将cookie设置为原始值,bas64编码:

set_cookie("token", base64_encode($token));

现在,要验证、解码然后散列:

$token = hash('sha256', base64_decode($cookie));

然后从数据库中查找用户id:

SELECT user_id FROM user_to_token WHERE token = ?

你完成了。

 类似资料:
  • 每个人在建构 PHP 应用时终究都会加入用户登录的模块。用户的帐号及密码会被储存在数据库中,在登录时用来验证用户。 在存储密码前正确的 哈希密码 是非常重要的。密码的哈希操作是单向不可逆的,该哈希值是一段固定长度的字符串且无法逆向推算出原始密码。这就代表你可以哈希另一串密码,来比较两者是否是同一个密码,但又无需知道原始的密码。如果你不将密码哈希,那么当未授权的第三者进入你的数据库时,所有用户的帐号

  • 我是在阅读了一些关于php中会话管理的主题后开始进行安全讨论的,请查看:https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-termer-persistence#title.2 引自章节:胡椒还是不胡椒? 一个更好的解决方案是,在将散列插入数据库之前对其进行加密,如果使用硬件分离,这种解决方案尤其有用。有了这

  • 多亏了最近一篇文章中的一些好建议,我才从中实现了PBKDF2https://defuse.ca/php-pbkdf2.htm进入一个小的PHP图像库,我正在建设教自己一些PHP。 我知道您将salt和hash存储在数据库中,然后在用户输入密码时重新构建它们以匹配。我不明白的是,当上面网站上的validate_password函数为同一个密码生成不同的、唯一的salt时,它是如何工作的。 例如,我创

  • 我正在写一个Django应用程序,需要与现有的Java播放框架应用程序一起工作。Play应用程序使用PasswordHash.java来存储密码。它以冒号分隔的格式存储密码。每个哈希都存储为::。 例如,下面是密码“测试”的条目: 在这里,我们可以通过拆分字符串并找到: 迭代次数: 盐: PBKDF2哈希:。 我修改了Django的check_密码机制以与此格式兼容,但发现它认为密码不正确。我用了

  • 问题内容: 我正在寻找一种使用mongoose将帐户保存到MongoDB的好方法。 我的问题是:密码是异步哈希的。设置器将无法在这里工作,因为它只能同步工作。 我考虑了两种方法: 创建模型的实例,并将其保存在哈希函数的回调中。 在“保存”上创建一个预钩子 这个问题有什么好的解决办法吗? 问题答案: mongodb博客上有一篇很棒的文章,详细介绍了如何实现用户身份验证。 http://blog.mo

  • 行动时间 - 哈希我们的密码 我们将在此部分中使用更安全的哈希密码AVP替换用户文件中的Cleartext-Password AVP。 关于如何创建和呈现散列密码似乎存在一般性的混淆。 我们将帮助您澄清此问题,以便为每种格式生成工作哈希值。 OpenLDAP常见问题解答是帮助我们处理哈希值的有价值的URL: http://www.openldap.org/faq/data/cache/419.ht

  • 我用哈希法通过了一个密码 这将密码作为哈希值存储到数据库中。但是当我试图通过 无论密码是否正确,它都会告诉我密码是正确的。有没有办法解决这个问题,所以我可以散列密码,但登录时输入(非散列)密码。

  • 问题内容: 来自github: 哈希密码: 要检查密码: 从上面看,比较中如何不包含盐值?我在这里想念什么? 问题答案: 盐合并到哈希中(以纯文本形式)。比较功能只是将盐从哈希表中提取出来,然后使用它来哈希密码并执行比较。