在設(shè)計(jì)一個(gè)系統(tǒng)的時(shí)候,肯定都有會(huì)有用戶身份認(rèn)證的問題,一般對(duì)用戶校驗(yàn)的時(shí)候,都是對(duì)用戶存在數(shù)據(jù)庫(kù)總的密碼哈希值進(jìn)行判斷,從而避免密碼泄露和反向解密,那么在Python 開發(fā)中,我們可以引入bcrypt 或 Passlib 對(duì)系統(tǒng)用戶密碼進(jìn)行哈希和驗(yàn)證處理,以及介紹使用其他類庫(kù)實(shí)現(xiàn)常規(guī)加解密處理操作。
在設(shè)計(jì)系統(tǒng)時(shí),用戶身份認(rèn)證是一個(gè)必不可少的問題。一般來(lái)說(shuō),用戶驗(yàn)證時(shí)會(huì)對(duì)數(shù)據(jù)庫(kù)中存儲(chǔ)的密碼哈希值進(jìn)行比對(duì),以避免密碼泄露和反向解密。在Python開發(fā)中,我們可以引入bcrypt或Passlib對(duì)用戶密碼進(jìn)行哈希和驗(yàn)證處理。本篇文章將介紹這兩者之間的差異,并提供實(shí)際使用中的一些代碼供參考。
bcrypt和Passlib都是用于密碼哈希和驗(yàn)證的Python庫(kù),但它們之間有一些顯著的區(qū)別:
當(dāng)確定只需要使用bcrypt算法并且不需要額外的復(fù)雜功能時(shí),bcrypt是一個(gè)合適的選擇。它適合簡(jiǎn)單的項(xiàng)目,或者在需要直接控制salt等參數(shù)的情況下使用。
Passlib適合復(fù)雜的項(xiàng)目,尤其是需要支持多個(gè)哈希算法或需要遷移哈希算法的場(chǎng)景。適合需要長(zhǎng)期維護(hù)的項(xiàng)目,因?yàn)樗峁┝烁嗟呐渲煤桶踩δ堋?
bcrypt: 靈活性較低,因?yàn)樗恢С謆crypt算法。沒有多種哈希算法選擇或密碼策略管理功能。使用簡(jiǎn)單,代碼更直觀。如果你只需要bcrypt算法,bcrypt庫(kù)可能更容易上手。
Passlib: 提供了很高的靈活性和擴(kuò)展性?梢愿鶕(jù)需要切換和配置不同的哈希算法,管理復(fù)雜的密碼策略。通過CryptContext,可以輕松管理不同算法之間的過渡。功能強(qiáng)大但相對(duì)復(fù)雜,需要更深入的學(xué)習(xí)和理解。但它的高層API設(shè)計(jì)得很友好,一旦熟悉,可以簡(jiǎn)化很多常見任務(wù)。CryptContext是其中一個(gè)用于管理多個(gè)哈希算法和密碼哈希策略的類。
示例代碼對(duì)比:
bcrypt 使用示例:
Passlib 使用示例:
定義了一個(gè)CryptContext對(duì)象,用于管理密碼哈希算法。schemes=["bcrypt"]表示你要使用bcrypt算法,而deprecated="auto"表示自動(dòng)管理過時(shí)的哈希方案。
使用pwd_context.hash()方法對(duì)密碼進(jìn)行哈希處理。每次生成的哈希值都是唯一的,即使是相同的密碼也會(huì)生成不同的哈希值。
使用pwd_context.verify()方法可以驗(yàn)證給定的密碼與存儲(chǔ)的哈希值是否匹配。
你還可以在創(chuàng)建CryptContext對(duì)象時(shí)傳遞更多參數(shù)來(lái)定制密碼哈希行為,這種方法可以增強(qiáng)密碼存儲(chǔ)的安全性。
在Passlib中,bcrypt算法默認(rèn)會(huì)自動(dòng)生成一個(gè)隨機(jī)salt,這也是bcrypt的一種安全特性。如果你想使用指定的salt進(jìn)行加密,需要注意的是,Passlib并不直接支持通過指定salt來(lái)進(jìn)行哈希處理,因?yàn)檫@可能會(huì)降低安全性。
如果你確實(shí)需要指定salt,可以使用bcrypt庫(kù)。
如果你使用Passlib,并想使用指定的salt,可以手動(dòng)拼接salt和密碼,然后對(duì)這個(gè)組合結(jié)果進(jìn)行哈希處理。這個(gè)方式一般不建議使用,因?yàn)樗茐牧薭crypt的安全設(shè)計(jì)原則。
同一密碼,每次獲得的hash值都會(huì)不同,那么有些人會(huì)問,如果通過pwd_context.hash獲得的hash值,下一次能夠?qū)Ρ日_嗎?
回答是的,使用pwd_context.hash()生成的哈希值可以在后續(xù)對(duì)比中正確匹配,即使每次生成的哈希值看起來(lái)不同。Passlib和bcrypt的設(shè)計(jì)確保了這一點(diǎn)。
即使你每次運(yùn)行pwd_context.hash(password)得到的哈希值不同(因?yàn)閟alt不同),pwd_context.verify(password, hashed_password)仍然會(huì)返回True,表示密碼驗(yàn)證成功。
Passlib主要用于密碼哈希處理,并不支持加密和解密操作。如果你需要對(duì)字符串進(jìn)行加密和解密,或者使用非對(duì)稱加密,你需要使用其他庫(kù),例如cryptography或PyCryptodome。
對(duì)于對(duì)稱加密,你可以使用cryptography庫(kù)中的Fernet,它是基于AES算法的加密方案。
對(duì)稱加密和解密示例
對(duì)于非對(duì)稱加密,你可以使用cryptography庫(kù)中的RSA算法。通常,非對(duì)稱加密用于加密較短的信息或加密對(duì)稱密鑰。
非對(duì)稱加密和解密示例
保存私鑰 :
加載私鑰 :
保存公鑰 :
加載公鑰 :
我們?cè)陂_發(fā)過程中,可以根據(jù)需求選擇合適的加密方式和庫(kù),并妥善管理密鑰。
小編推薦閱讀機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對(duì)象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動(dòng)態(tài)代理的對(duì)比分析
閱讀Win11筆記本“自動(dòng)管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)