python - 为什么 werkzeugs `generate_password_hash` 的输出不是恒定的?

标签 python flask password-encryption

当我多次运行 werkzeug.security.generate_password_hash("Same password") ( docs ) 时,每次的输出都不一样。

我做错了什么?为什么不恒定?

最佳答案

密码是加盐,是的。在散列之前将盐添加到密码中,以确保散列在 rainbow table attack 中不可用.

因为每次调用函数时salt都是随机生成的,所以得到的密码hash也不同。返回的哈希包含生成的盐,因此仍然可以正确验证密码。

演示:

>>> from werkzeug.security import generate_password_hash
>>> generate_password_hash('foobar')
'pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d'
>>> generate_password_hash('foobar')
'pbkdf2:sha1:1000$XHj5nlLU$bb9a81bc54e7d6e11d9ab212cd143e768ea6225d'

这两个字符串不同;但包含足够的信息来验证密码,因为生成的盐包含在每个:

# pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d
  ^^^^^^^^^^^^^^^^   salt   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      algo info    ^^^^^^^^        actual hash of the password
  (PBKDF2 applied SHA1 1000 times)

因为随机盐是tYqN0VeL for one和XHj5nlLU,所以得到的hash也不同。

foobar 密码仍然可以根据任一哈希进行验证:

>>> from werkzeug.security import check_password_hash
>>> check_password_hash('pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d', 'foobar')
True
>>> check_password_hash('pbkdf2:sha1:1000$XHj5nlLU$bb9a81bc54e7d6e11d9ab212cd143e768ea6225d', 'foobar')
True

另见

关于python - 为什么 werkzeugs `generate_password_hash` 的输出不是恒定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23432478/

相关文章:

python - Flask Web 服务器上出现内部服务器错误

python - 从 pandas 单元格内的列表中删除括号

python - ntpath.py 上的特殊错误

python - 浏览器在 flask 中缓存静态文件?

flask - 使用 Flask-Admin 自定义 ListView

java - 基于用户输入 key 的加密

python - 你是如何用docker迭代开发的?

python 'x days ago' 到日期时间

java - Jasypt - 如何使用 StrongPasswordEncryptor 作为 .properties 文件中的凭据

grails - 基本密码散列 Grails