为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用哈希进行密码检查?

如何使用哈希进行密码检查?

qq_花开花谢_0 2021-07-29 14:24:27
我正在通过Miguel Grinberg的精彩教程学习 Flask 。在那一章中,出于安全原因,他建议存储用户的密码哈希而不是密码本身。使用的函数是generate_password_hash, check_password_hash。但即使您generate_password_hash使用相同的字符串调用,您也可以获得不同的哈希值:>>> from werkzeug.security import generate_password_hash>>> generate_password_hash('foo')'pbkdf2:sha256:50000$E4Mg0BEy$c8db80b3ddefad78a93eaa47b22da5ce04adb969913b00545302cbf23501fdbb'>>> generate_password_hash('foo')'pbkdf2:sha256:50000$UCXVV09c$fe38b6099a0059957e283f2e4706fdbf01ef6e762b1070116df17867aa04e053'那么check_password_hash如果同一个字符串可以有尽可能多的哈希值,那么工作如何呢?
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

密码用盐进行散列,盐是由字母和数字组成的伪随机字符串。每次运行时盐都会不同generate_password_hash()。因此,生成的哈希值也会有所不同。

这样做是为了让黑客不能简单地猜测常见密码的哈希值。例如,'pass1234' 本身的哈希值每次都是相同的。但是,'pass1234 + salt 的哈希值每次都会不同。您的数据库应该存储哈希值以及盐值(重要的是不是明文密码)。如果有关用户帐户的信息泄露,这可以最大限度地减少造成的损失。

在 Flask 和 werkzeug 的情况下,返回值generate_password_hash()的形式为:(method$salt$hash您可以$在您提供的屏幕截图中看到两个符号)。因此,下次您根据散列检查明文密码时,您将获得带有盐值的密码,generate_password_hash()并查看它是否与散列值匹配。


查看完整回答
反对 回复 2021-08-03
?
守候你守候我

TA贡献1802条经验 获得超10个赞

那么如果同一个字符串可以有任意多的 > 哈希值,那么 check_password_hash 是如何工作的呢?


一个简化的解决方案可能是这样的,


1)无盐

 user_id|  raw_password  |   hash_value  

  user1 |  'foo'         |  same_hashed_value      

  user2 |  'foo'         |  same_hashed_value

   

您可能已经知道,这里相同的密码会产生相同的哈希值,这很容易受到字典攻击。所以我们可以添加一些随机值(salt)来减轻这种攻击,如下面的解决方案所示。


2)加盐

生成哈希过程:


  user_id | raw_password  |   password_with_salt  |  hash_value   

   user1  |      'foo'    |  'foo#salt123'        |  different_hash_1   

   user2  |      'foo'    |  'foo#saltABC'        |  different_hash_2   

在这种情况下,hash_value 及其相关的 salt_value 可以存储在数据库中。否则,concat ( hash_vaule, salt_value) 作为一个字符串来存储,这是等价的。


检查哈希过程:


1)从数据库中检索用户的salt_value和hash_value。

2) 将 salt_value 附加到给定的密码并使用相同的哈希函数对其进行哈希处理。

3)将给定密码的哈希值与数据库中的哈希值进行比较。如果它们匹配,则密码是正确的。否则,密码不正确。


查看完整回答
反对 回复 2021-08-03
  • 2 回答
  • 0 关注
  • 241 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号