Flask - generate_password_hash不是常量输出

jet*_*com 18 python password-encryption flask

在烧瓶中,

当我尝试werkzeug.security.generate_password_hash("Same password")多次运行时,每次输出都不同?

我究竟做错了什么.为什么不恒定?

我猜它与设置盐有关?

Mar*_*ers 42

密码是盐渍的,是的.在散列之前将salt添加到密码中,以确保散列在彩虹表攻击中不可用.

因为每次调用函数时都会随机生成salt,所以生成的密码哈希值也会不同.返回的哈希包括生成的salt,因此仍然可以正确验证密码.

演示:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

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

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

因为随机盐是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
Run Code Online (Sandbox Code Playgroud)

另见

  • @ЭлёржонКимсанов:盐的存在是为了击败彩虹表攻击,彩虹表攻击是将常见密码转换为哈希值的列表。如果没有随机盐,这样的表很容易预先生成,然后一遍又一遍地重复使用。使用盐,您需要生成与可能的盐值一样多的表,这是根本不可行的。盐值本身**并不重要**,只是同一数据库中的不同密码使用不同的随机盐值。所以不,可见的盐并不是安全风险,只有没有适当的随机盐值才是安全风险。 (3认同)