2 回答

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

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)将给定密码的哈希值与数据库中的哈希值进行比较。如果它们匹配,则密码是正确的。否则,密码不正确。
添加回答
举报