Python 为什么werkzeugs'generate\u password\u hash'的输出不是常量?

Python 为什么werkzeugs'generate\u password\u hash'的输出不是常量?,python,flask,password-encryption,Python,Flask,Password Encryption,当我多次运行werkzeug.security.generate_password_hash(“相同密码”)()时,每次的输出都是不同的 我做错了什么?为什么它不是常数?密码是咸的,是的。在散列之前,会将salt添加到密码中,以确保散列在密码中不可用 由于每次调用函数时都会随机生成salt,因此生成的密码哈希也不同。返回的散列包含生成的salt,因此仍然可以正确验证密码 演示: 这两条弦不同;但包含足够的信息以验证密码,因为生成的salt包含在每个: # pbkdf2:sha1:1000$tYq

当我多次运行
werkzeug.security.generate_password_hash(“相同密码”)
()时,每次的输出都是不同的

我做错了什么?为什么它不是常数?

密码是咸的,是的。在散列之前,会将salt添加到密码中,以确保散列在密码中不可用

由于每次调用函数时都会随机生成salt,因此生成的密码哈希也不同。返回的散列包含生成的salt,因此仍然可以正确验证密码

演示:

这两条弦不同;但包含足够的信息以验证密码,因为生成的salt包含在每个:

# pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d
  ^^^^^^^^^^^^^^^^   salt   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      algo info    ^^^^^^^^        actual hash of the password
  (PBKDF2 applied SHA1 1000 times)
因为随机salt是一个的
tYqN0VeL
,而
XHj5nlLU
,所以产生的散列也是不同的

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
也看到

  • (密码学.SE)
  • (Security.SE)

结果表明,当我将其存储在数据库中时,我正在截断它。因此,我无法正确比较:-)谢谢你提出这个问题-我正在重新设置,以便进行比较,而不是使用check\u password\u hash()方法。如果不是为了这个问题的答案,我不知道该怎么做。请投你们两个的票。
>>> 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