您的位置:首頁 > 軟件教程 > 教程 > Python開發(fā)中的用戶密碼哈希算法選擇:bcrypt和Passlib

Python開發(fā)中的用戶密碼哈希算法選擇:bcrypt和Passlib

來源:好特整理 | 時間:2024-08-22 09:48:45 | 閱讀:163 |  標簽: a T Cry 哈希算法 S C 算法 開發(fā) 用戶 密碼 Python   | 分享到:

在設(shè)計一個系統(tǒng)的時候,肯定都有會有用戶身份認證的問題,一般對用戶校驗的時候,都是對用戶存在數(shù)據(jù)庫總的密碼哈希值進行判斷,從而避免密碼泄露和反向解密,那么在Python 開發(fā)中,我們可以引入bcrypt 或 Passlib 對系統(tǒng)用戶密碼進行哈希和驗證處理,以及介紹使用其他類庫實現(xiàn)常規(guī)加解密處理操作。

在設(shè)計系統(tǒng)時,用戶身份認證是一個必不可少的問題。一般來說,用戶驗證時會對數(shù)據(jù)庫中存儲的密碼哈希值進行比對,以避免密碼泄露和反向解密。在Python開發(fā)中,我們可以引入bcrypt或Passlib對用戶密碼進行哈希和驗證處理。本篇文章將介紹這兩者之間的差異,并提供實際使用中的一些代碼供參考。

1、bcrypt和Passlib的介紹

bcrypt和Passlib都是用于密碼哈希和驗證的Python庫,但它們之間有一些顯著的區(qū)別:

  • bcrypt:
    • bcrypt是一個專門用于實現(xiàn)bcrypt哈希算法的庫。它相對簡單,專注于單一功能,即對密碼進行bcrypt哈希處理和驗證。
    • 適合只需要bcrypt哈希算法的場景。
    • 提供的API簡單直接,功能較少。
  • Passlib:
    • Passlib是一個更高級的密碼哈希庫,它支持多種哈希算法(如bcrypt、PBKDF2、Argon2等),并且提供了更豐富的功能。
    • 適合需要支持多種密碼哈希算法和策略的場景。
    • 提供的CryptContext類可以方便地管理和遷移多個哈希算法,還提供了密碼哈希的自動升級機制,以及對舊算法的棄用處理。

當(dāng)確定只需要使用bcrypt算法并且不需要額外的復(fù)雜功能時,bcrypt是一個合適的選擇。它適合簡單的項目,或者在需要直接控制salt等參數(shù)的情況下使用。

Passlib適合復(fù)雜的項目,尤其是需要支持多個哈希算法或需要遷移哈希算法的場景。適合需要長期維護的項目,因為它提供了更多的配置和安全功能。

bcrypt: 靈活性較低,因為它只支持bcrypt算法。沒有多種哈希算法選擇或密碼策略管理功能。使用簡單,代碼更直觀。如果你只需要bcrypt算法,bcrypt庫可能更容易上手。

Passlib: 提供了很高的靈活性和擴展性。可以根據(jù)需要切換和配置不同的哈希算法,管理復(fù)雜的密碼策略。通過CryptContext,可以輕松管理不同算法之間的過渡。功能強大但相對復(fù)雜,需要更深入的學(xué)習(xí)和理解。但它的高層API設(shè)計得很友好,一旦熟悉,可以簡化很多常見任務(wù)。CryptContext是其中一個用于管理多個哈希算法和密碼哈希策略的類。

示例代碼對比:

bcrypt 使用示例:

Passlib 使用示例:

定義了一個CryptContext對象,用于管理密碼哈希算法。schemes=["bcrypt"]表示你要使用bcrypt算法,而deprecated="auto"表示自動管理過時的哈希方案。

使用pwd_context.hash()方法對密碼進行哈希處理。每次生成的哈希值都是唯一的,即使是相同的密碼也會生成不同的哈希值。

使用pwd_context.verify()方法可以驗證給定的密碼與存儲的哈希值是否匹配。

你還可以在創(chuàng)建CryptContext對象時傳遞更多參數(shù)來定制密碼哈希行為,這種方法可以增強密碼存儲的安全性。

2、使用指定的salt進行加密

在Passlib中,bcrypt算法默認會自動生成一個隨機salt,這也是bcrypt的一種安全特性。如果你想使用指定的salt進行加密,需要注意的是,Passlib并不直接支持通過指定salt來進行哈希處理,因為這可能會降低安全性。

  1. 手動拼接salt和密碼: 可以手動拼接salt和密碼,然后對結(jié)果進行哈希處理。但這種方法僅適用于了解風(fēng)險并確保安全措施的場景。
  2. 使用bcrypt庫: 直接使用bcrypt庫進行處理,它允許你傳遞一個指定的salt。不過,注意這會有一定的安全風(fēng)險。

1) 使用bcrypt庫指定salt

如果你確實需要指定salt,可以使用bcrypt庫。

2) 手動拼接salt和密碼

如果你使用Passlib,并想使用指定的salt,可以手動拼接salt和密碼,然后對這個組合結(jié)果進行哈希處理。這個方式一般不建議使用,因為它破壞了bcrypt的安全設(shè)計原則。

注意事項

  • 使用固定的salt會降低密碼哈希的安全性,因為相同的salt和相同的密碼會生成相同的哈希值。
  • bcrypt的設(shè)計初衷是讓每次生成的salt都不同,以此提高安全性。
  • 如果你需要在特定的場景下使用固定的salt,一定要確保你的系統(tǒng)有足夠的其他安全措施。

同一密碼,每次獲得的hash值都會不同,那么有些人會問,如果通過pwd_context.hash獲得的hash值,下一次能夠?qū)Ρ日_嗎?

回答是的,使用pwd_context.hash()生成的哈希值可以在后續(xù)對比中正確匹配,即使每次生成的哈希值看起來不同。Passlib和bcrypt的設(shè)計確保了這一點。

  • 自動生成的salt: 每次你使用pwd_context.hash()生成一個新的哈希值時,bcrypt都會自動生成一個隨機的salt并將其嵌入到生成的哈希值中。因此,即使對同一個密碼進行多次哈希,每次生成的哈希值也會不同。
  • 驗證過程: 在驗證過程中,pwd_context.verify()會自動從存儲的哈希值中提取salt并重新計算哈希,然后將其與提供的哈希值進行比較。這意味著,即使哈希值不同,驗證仍然能夠成功匹配。

即使你每次運行pwd_context.hash(password)得到的哈希值不同(因為salt不同),pwd_context.verify(password, hashed_password)仍然會返回True,表示密碼驗證成功。

3、加密和解密處理

Passlib主要用于密碼哈希處理,并不支持加密和解密操作。如果你需要對字符串進行加密和解密,或者使用非對稱加密,你需要使用其他庫,例如cryptography或PyCryptodome。

1) 對稱加密和解密

對于對稱加密,你可以使用cryptography庫中的Fernet,它是基于AES算法的加密方案。

對稱加密和解密示例

2) 非對稱加密和解密

對于非對稱加密,你可以使用cryptography庫中的RSA算法。通常,非對稱加密用于加密較短的信息或加密對稱密鑰。

非對稱加密和解密示例

3) 保存和加載密鑰

保存私鑰 :

加載私鑰 :

保存公鑰 :

加載公鑰 :

我們在開發(fā)過程中,可以根據(jù)需求選擇合適的加密方式和庫,并妥善管理密鑰。

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認同期限觀點或證實其描述。

a 1.0
a 1.0
類型:休閑益智  運營狀態(tài):正式運營  語言:中文   

游戲攻略

游戲禮包

游戲視頻

游戲下載

游戲活動

《alittletotheleft》官網(wǎng)正版是一款備受歡迎的休閑益智整理游戲。玩家的任務(wù)是對日常生活中的各種雜亂物

相關(guān)視頻攻略

更多

掃二維碼進入好特網(wǎng)手機版本!

掃二維碼進入好特網(wǎng)微信公眾號!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]

湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2024 haote.com 好特網(wǎng)