![](/img/trans.png)
[英]Can't retrieve hashed password from postgreSQL Database with 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.encrypt
和pbkdf2_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.