avatar

目录
关于同一密码使用generate_password_hash生成不同的密码散列值

导言

在python的 werkzeug.security 库中有两个函数generate_password_hash与check_password_hash,用于对密码明文生成散列值以及检查密码是否与提供的散列值相符,但今天测试时发现同一密码使用generate_password_hash会生成不同的密码散列值,那么check方法是怎么执行的呢?以及散列值到底是如何生成的呢?

解决

以下是werkzeug.security模块中generate_password_hash函数的定义

python
1
2
3
4
5
6
def generate_password_hash(password, method="pbkdf2:sha256", salt_length=8):
#根据"salt_length"参数随机生成盐值
salt = gen_salt(salt_length) if method != "plain" else ""
#根据 加密方法,盐值,密码明文 生成散列值并返回 散列值以及加密方法
h, actual_method = _hash_internal(method, salt, password)
return "%s$%s$%s" % (actual_method, salt, h)

由函数定义可见,

函数的第一行会生成一个随机盐值,

第二行会根据第一行生成的随机盐值以及指定的加密算法生成一个密码哈希值。

第三行返回一个加密过后的密码,返回值的格式为 “加密算法$盐值$密码哈希值”

大家都知道,”明文+加密算法+盐值=密文”。而第一行生成的盐值却是随机的,因此在明文以及加密算法一致的情况下,生成的密文就不同。而函数最后的返回值自然也就不同。

关于check方法如何执行,上面提到,generate_password_hash方法返回值的格式为“加密算法$盐值$密码哈希值”,因而在加密算法和盐值都知道的情况下,将密码明文按照规则加密,将得到的密文与原密码中的密码哈希值相对比,即可知道密码是否正确

文章作者: 3927o
文章链接: http://yoursite.com/%E5%85%B3%E4%BA%8E%E5%90%8C%E4%B8%80%E5%AF%86%E7%A0%81%E4%BD%BF%E7%94%A8generate_password_hash%E7%94%9F%E6%88%90%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AF%86%E7%A0%81%E6%95%A3%E5%88%97%E5%80%BC/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lin's document

评论