[英]Salt in PBKDF2 - Python
我正在學習如何在使用MySQL和Python進行開發時保護密碼,遵循本教程 。
我的理解是用戶密碼存儲在數據庫哈希,並且鹽存儲在未加密的一側,這樣我們就可以獲取哈希密碼和鹽,並使用鹽重新輸入輸入的密碼,然后比較兩者。
雖然,當使用PBKDF2(通過passlib.hash.sha256_crypt()
函數)時,我無法設置自己的鹽,只有它的大小。 那么如何使用相同的鹽重新密碼密碼,以便我可以比較兩者?
Passlib密碼哈希界面允許您設置鹽大小 或 salt
值本身。 從pbkdf2_sha256
上的文檔 :
salt
( bytes )可選的salt字節。 如果指定,則長度必須介於0-1024字節之間。 如果未指定,將自動生成16字節的鹽(建議這樣做)。
salt_size
( int ) - 自動生成新鹽時salt_size
可選字節數。 默認為16個字節,但可以是0到1024之間的任何值。
所以你可以設置自己預先生成的鹽:
>>> from passlib.hash import pbkdf2_sha256
>>> pbkdf2_sha256.hash("password", rounds=200000, salt=b'spamhameggs')
'$pbkdf2-sha256$200000$c3BhbWhhbWVnZ3M$WL9OLVcb3f7HqHeNT./kCJeunydLCi4JykzEuAdewcI'
但請注意,salt是返回字符串的一部分。 該字符串包含不僅產生的散列值,而且算法,采用回合的數量和使用的鹽,通過分隔$
。 鹽被編碼為base64的修改形式 。 您可以通過再次解碼字符串c3BhbWhhbWVnZ3M
來驗證這一點::
>>> from passlib.utils.binary import ab64_decode
>>> ab64_decode(b'c3BhbWhhbWVnZ3M')
b'spamhameggs'
請參閱pbkdf2_sha256
文檔的格式和算法部分。
因此,當您將完整的字符串pbkdf2_sha256
存儲在數據庫中時, 驗證字符串的所有內容都在值中,包括salt。 留下生成隨機鹽最好留給該庫,因為它將使用安全方法生成一個。
您可能希望閱讀有關密碼散列的Passlib教程 ,其中包括如何在數據庫中存儲時散列密碼,以及如何再次驗證它們(例如使用pdkdf2_sha256.verify(password_user_entered, hash_stored_in_database)
),其中涵蓋了這一理由。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.