在設(shè)計一個系統(tǒng)的時候,肯定都有會有用戶身份認(rèn)證的問題,一般對用戶校驗的時候,都是對用戶存在數(shù)據(jù)庫總的密碼哈希值進(jìn)行判斷,從而避免密碼泄露和反向解密,那么在Python 開發(fā)中,我們可以引入bcrypt 或 Passlib 對系統(tǒng)用戶密碼進(jìn)行哈希和驗證處理,以及介紹使用其他類庫實現(xiàn)常規(guī)加解密處理操作。
在設(shè)計系統(tǒng)時,用戶身份認(rèn)證是一個必不可少的問題。一般來說,用戶驗證時會對數(shù)據(jù)庫中存儲的密碼哈希值進(jìn)行比對,以避免密碼泄露和反向解密。在Python開發(fā)中,我們可以引入bcrypt或Passlib對用戶密碼進(jìn)行哈希和驗證處理。本篇文章將介紹這兩者之間的差異,并提供實際使用中的一些代碼供參考。
bcrypt和Passlib都是用于密碼哈希和驗證的Python庫,但它們之間有一些顯著的區(qū)別:
當(dāng)確定只需要使用bcrypt算法并且不需要額外的復(fù)雜功能時,bcrypt是一個合適的選擇。它適合簡單的項目,或者在需要直接控制salt等參數(shù)的情況下使用。
Passlib適合復(fù)雜的項目,尤其是需要支持多個哈希算法或需要遷移哈希算法的場景。適合需要長期維護(hù)的項目,因為它提供了更多的配置和安全功能。
bcrypt: 靈活性較低,因為它只支持bcrypt算法。沒有多種哈希算法選擇或密碼策略管理功能。使用簡單,代碼更直觀。如果你只需要bcrypt算法,bcrypt庫可能更容易上手。
Passlib: 提供了很高的靈活性和擴(kuò)展性?梢愿鶕(jù)需要切換和配置不同的哈希算法,管理復(fù)雜的密碼策略。通過CryptContext,可以輕松管理不同算法之間的過渡。功能強(qiáng)大但相對復(fù)雜,需要更深入的學(xué)習(xí)和理解。但它的高層API設(shè)計得很友好,一旦熟悉,可以簡化很多常見任務(wù)。CryptContext是其中一個用于管理多個哈希算法和密碼哈希策略的類。
示例代碼對比:
bcrypt 使用示例:
Passlib 使用示例:
定義了一個CryptContext對象,用于管理密碼哈希算法。schemes=["bcrypt"]表示你要使用bcrypt算法,而deprecated="auto"表示自動管理過時的哈希方案。
使用pwd_context.hash()方法對密碼進(jìn)行哈希處理。每次生成的哈希值都是唯一的,即使是相同的密碼也會生成不同的哈希值。
使用pwd_context.verify()方法可以驗證給定的密碼與存儲的哈希值是否匹配。
你還可以在創(chuàng)建CryptContext對象時傳遞更多參數(shù)來定制密碼哈希行為,這種方法可以增強(qiáng)密碼存儲的安全性。
在Passlib中,bcrypt算法默認(rèn)會自動生成一個隨機(jī)salt,這也是bcrypt的一種安全特性。如果你想使用指定的salt進(jìn)行加密,需要注意的是,Passlib并不直接支持通過指定salt來進(jìn)行哈希處理,因為這可能會降低安全性。
如果你確實需要指定salt,可以使用bcrypt庫。
如果你使用Passlib,并想使用指定的salt,可以手動拼接salt和密碼,然后對這個組合結(jié)果進(jìn)行哈希處理。這個方式一般不建議使用,因為它破壞了bcrypt的安全設(shè)計原則。
同一密碼,每次獲得的hash值都會不同,那么有些人會問,如果通過pwd_context.hash獲得的hash值,下一次能夠?qū)Ρ日_嗎?
回答是的,使用pwd_context.hash()生成的哈希值可以在后續(xù)對比中正確匹配,即使每次生成的哈希值看起來不同。Passlib和bcrypt的設(shè)計確保了這一點。
即使你每次運行pwd_context.hash(password)得到的哈希值不同(因為salt不同),pwd_context.verify(password, hashed_password)仍然會返回True,表示密碼驗證成功。
Passlib主要用于密碼哈希處理,并不支持加密和解密操作。如果你需要對字符串進(jìn)行加密和解密,或者使用非對稱加密,你需要使用其他庫,例如cryptography或PyCryptodome。
對于對稱加密,你可以使用cryptography庫中的Fernet,它是基于AES算法的加密方案。
對稱加密和解密示例
對于非對稱加密,你可以使用cryptography庫中的RSA算法。通常,非對稱加密用于加密較短的信息或加密對稱密鑰。
非對稱加密和解密示例
保存私鑰 :
加載私鑰 :
保存公鑰 :
加載公鑰 :
我們在開發(fā)過程中,可以根據(jù)需求選擇合適的加密方式和庫,并妥善管理密鑰。
小編推薦閱讀golang slice相關(guān)常見的性能優(yōu)化手段
閱讀連接Elasticsearch服務(wù)器的Python代碼示例
閱讀國產(chǎn)操作系統(tǒng)上實現(xiàn)RTMP推流攝像頭視頻和麥克風(fēng)聲音到流媒體服務(wù)器
閱讀使用Python讀取和導(dǎo)出NetCDF格式的多時相柵格文件
閱讀多租戶系統(tǒng)數(shù)據(jù)權(quán)限設(shè)計與RuoYi系統(tǒng)的借鑒
閱讀count(*)、count(1)哪個更快?面試必問:通宵整理的十道經(jīng)典MySQL必問面試題
閱讀從需求分析、產(chǎn)品設(shè)計到部署交付各階段說明
閱讀如何利用七牛云進(jìn)行數(shù)據(jù)備份和刪除
閱讀強(qiáng)化學(xué)習(xí)筆記之【ACE:Off-PolicyActor-CriticwithCausality-AwareEntropyRegularization】
閱讀使用MailKit在.NET Core中收發(fā)郵件的完整示例
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2024 haote.com 好特網(wǎng)