Skip to main content
 首页 » 编程设计

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

2025年05月04日19tintown

我正在通过 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() 的盐值,并查看它是否与哈希值匹配。