Why is the output of werkzeugs `generate_password_hash` not constant?

前端 未结 1 1964
日久生厌
日久生厌 2020-12-25 12:41

When I run werkzeug.security.generate_password_hash(\"Same password\") (docs) multiple times, the output is different each time.

What am I doing wrong?

相关标签:
1条回答
  • 2020-12-25 13:26

    The password is salted, yes. The salt is added to the password before hashing, to ensure that the hash isn't useable in a rainbow table attack.

    Because the salt is randomly generated each time you call the function, the resulting password hash is also different. The returned hash includes the generated salt so that can still correctly verify the password.

    Demo:

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

    These two strings differ; but contain enough information to verify the password because the generated salt is included in each:

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

    Because the random salt is tYqN0VeL for one and XHj5nlLU, the resulting hash is also different.

    The foobar password can still be verified against either 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
    

    Also see

    • Can you help me understand what a cryptographic “salt” is? (Cryptography.SE)
    • Why is using salt more secure? (Security.SE)
    0 讨论(0)
提交回复
热议问题