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

我正在通过Miguel Grinberg的精彩教程学习 Flask 。在那一章中,出于安全原因,他建议存储用户的密码哈希而不是密码本身。使用的函数是generate_password_hashcheck_password_hash。但即使您generate_password_hash使用相同的字符串调用,您也可以获得不同的哈希值:

http://img3.mukewang.com/6108f82900017e9d09510108.jpg

>>> 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如果同一个字符串可以有尽可能多的哈希值,那么工作如何呢?


qq_花开花谢_0
浏览 242回答 2
2回答

蝴蝶刀刀

密码用盐进行散列,盐是由字母和数字组成的伪随机字符串。每次运行时盐都会不同generate_password_hash()。因此,生成的哈希值也会有所不同。这样做是为了让黑客不能简单地猜测常见密码的哈希值。例如,'pass1234' 本身的哈希值每次都是相同的。但是,'pass1234 + salt 的哈希值每次都会不同。您的数据库应该存储哈希值以及盐值(重要的是不是明文密码)。如果有关用户帐户的信息泄露,这可以最大限度地减少造成的损失。在 Flask 和 werkzeug 的情况下,返回值generate_password_hash()的形式为:(method$salt$hash您可以$在您提供的屏幕截图中看到两个符号)。因此,下次您根据散列检查明文密码时,您将获得带有盐值的密码,generate_password_hash()并查看它是否与散列值匹配。

守候你守候我

那么如果同一个字符串可以有任意多的 > 哈希值,那么 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)将给定密码的哈希值与数据库中的哈希值进行比较。如果它们匹配,则密码是正确的。否则,密码不正确。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python