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

标签 python hash

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

enter image description here

>>> 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/

相关文章:

python - 在同一时间戳下对 csv 数据进行分组

python - 我正在尝试使用提供的 json 文件中的数据创建数据库

java - 使用 SHA-512 和 salt 来散列 MD5 散列密码?

java - Java集合框架中的Hashtable、HashMap、HashSet、哈希表概念

Perl 获取单个散列本身的散列键值计数

python - 为什么 CPython 的 hash(-1) != -1

python - 使用 Python 编写和修改现有工作簿

python - 使用python更新CKAN中的资源

python - 如何从 Visual Studio 中的给定 .pyd 输出构造 python 代码?

java - 如何在客户端哈希密码?如何从java设备(android)传输密码?