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