簡體   English   中英

哈希密碼與Python中的原始密碼不匹配

[英]Hashed password doesn't match original in Python

我有兩個其余的端點,一個端點注冊一個用戶,第二個端點允許該用戶登錄。 這是我用來哈希用戶密碼並將哈希密碼存儲在數據庫中的代碼,

from passlib.hash import pbkdf2_sha256
def _get_hashed_password(self, password):
    return pbkdf2_sha256.encrypt(password, rounds=200000, salt_size=16)

現在在登錄端點上,我使用此代碼來驗證哈希密碼,

password = data['password']
hash = pbkdf2_sha256.encrypt(password, rounds=200000, salt_size=16)
pbkdf2_sha256.verify(user.hashed_password, hash)

這種方法失敗了,顯然是因為兩個密碼不同,

$pbkdf2-sha256$200000$ai0FoDTG2BuDkDKGEIJQKg$Ik06dr61.2rRMDwZCZMdVq.zMe5887.ksDxvmSXFRwE
$pbkdf2-sha256$200000$pHTuHYNwLoXQeu8dI0QoxQ$2z4cZl9Njz9X/bxNtWCZzzeplWO.jTZA2v5lvcmgFE8

我想知道如何使它工作?

pbkdf2_sha256.encryptpbkdf2_sha256.verify不只是計算密碼的哈希值。 仔細查看pbkdf2_sha256.encrypt的輸出

$pbkdf2-sha256$200000$ai0FoDTG2BuDkDKGEIJQKg$Ik06dr61.2rRMDwZCZMdVq.zMe5887.ksDxvmSXFRwE
----------------------------------------------------------------------------------------
$  algorithm  $rounds$         salt         $             the actual hash

您可以切換算法,在幾年內增加輪數,並且pbkdf2_sha256.verify仍然能夠針對存儲在數據庫中的哈希值驗證純文本密碼。

兩次重復使用相同的密碼不會每次都得到相同的結果,因為使用了隨機鹽。 如果攻擊者可以訪問您的密碼哈希,則該鹽可以防止彩虹表攻擊 基本上,您計算的不是hash(password)而是hash(salt + password) 由於鹽已經在上面的字符串中給出,並且您大概知道了密碼,因此您還將知道salt + password的值,您的生活將不會再困難。 但是對於僅花費大量時間僅對hash(password)預計算的攻擊者而言,這些散列都不會有用,因為它們沒有包含您的隨機鹽。

如注釋中發布的示例所示,您無需執行任何特殊操作即可驗證密碼:

pbkdf2_sha256.verify(password, user.hashed_password)

驗證密碼時無需調用pbkdf2_sha256.encrypt pbkdf2_sha256.verify會為您完成所有這些操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM