我正在通过 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
是如何工作的?
最佳答案
密码使用盐进行哈希处理,盐是由字母和数字组成的伪随机字符串。每次运行 generate_password_hash()
时盐都会不同。因此,生成的哈希值也会不同。
这样做是为了让黑客无法简单地猜测普通密码的哈希值。例如,'pass1234' 本身的哈希值每次都是相同的。但是,'pass1234 + salt 的散列每次都会不同。您的数据库应该存储散列和盐(重要的是不是明文密码)。如果有关用户帐户的信息泄露,这会最大限度地减少造成的损害。
在 Flask 和 werkzeug 的情况下,generate_password_hash()
的返回值的形式是:method$salt$hash
(你可以看到两个 $
您提供的屏幕截图中的符号)。因此,下次您根据哈希值检查明文密码时,您会得到它和来自 generate_password_hash()
的盐值,并查看它是否与哈希值匹配。
关于python - 如何使用哈希进行密码检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53057467/