check_password 是 Django 提供的一个用于密码校验的函数,它的工作原理是基于密码哈希算法的特性。
Django 的 make_password 函数在生成密码哈希时,会使用一个随机的 salt(盐值)。这个 salt 会与密码一起进行哈希运算,生成最终的哈希值。由于 salt 是随机的,因此即使输入相同的密码,生成的哈希值也会不同。
为什么 check_password 可以正确校验密码?
1. 密码存储的原理
在 Django 中,密码通常是以哈希值的形式存储在数据库中的,而不是明文存储。哈希是一种单向加密算法,它可以将任意长度的输入(如密码)转换为固定长度的输出(哈希值)。哈希算法的特点是:
-
不可逆性:无法从哈希值反推出原始密码。
-
唯一性:不同的输入几乎不可能生成相同的哈希值。
-
随机性:即使输入相同,每次生成的哈希值也可能不同(因为使用了随机的 salt)。
Django 使用 make_password
函数对密码进行哈希处理。例如:
from django.contrib.auth.hashers import make_password# 对密码进行哈希处理
hashed_password = make_password('qwe123')
print(hashed_password)
结果类似下面的
生成的哈希值包含以下部分:
-
算法名称(如
pbkdf2_sha256
):用于标识使用的哈希算法。 -
迭代次数(如
600000
):用于增加哈希计算的复杂度。 -
Salt(盐值,如 8GwcoEyP0yk48cG89Emm8w):一个随机字符串,用于增加哈希的唯一性。
-
哈希值(如 XsogYGIVzWCEvUuJwIMuYMNGt5wFyyiEpi+vh1kz39g=):密码和 salt 经过哈希算法计算后的结果。
2. 密码校验的原理
当用户登录时,输入的密码需要与数据库中存储的哈希密码进行比对。由于哈希是不可逆的,我们不能直接解密哈希值来获取原始密码。因此,Django 使用 check_password
函数来完成密码校验。
check_password
的工作原理如下:
-
提取 Salt:从数据库中存储的哈希密码中提取出 salt。
-
重新计算哈希值:将用户输入的密码与提取的 salt 结合,使用相同的哈希算法和迭代次数重新计算哈希值。
-
比对哈希值:将重新计算的哈希值与数据库中存储的哈希值进行比对。如果两者一致,说明用户输入的密码是正确的。
例如
from django.contrib.auth.hashers import check_password# 用户输入的密码
input_password = 'qwe123'# 数据库中存储的哈希密码
stored_hashed_password = 'pbkdf2_sha256$600000$uRejMsolXFgxqvVJk5543w$XsogYGIVzWCEvUuJwIMuYMNGt5wFyyiEpi+vh1kz39g='# 校验密码
is_valid = check_password(input_password, stored_hashed_password)
print(is_valid) # 如果密码正确,返回 True;否则返回 False