最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用bcrypt?或?Passlib?對(duì)系統(tǒng)用戶密碼進(jìn)行哈希和驗(yàn)證處理操作

 更新時(shí)間:2024年08月22日 09:15:21   作者:伍華聰  
在Python?開(kāi)發(fā)中,我們可以引入bcrypt?或?Passlib?對(duì)系統(tǒng)用戶密碼進(jìn)行哈希和驗(yàn)證處理,以及介紹使用其他類(lèi)庫(kù)實(shí)現(xiàn)常規(guī)加解密處理操作,需要的朋友可以參考下

在設(shè)計(jì)一個(gè)系統(tǒng)的時(shí)候,肯定都有會(huì)有用戶身份認(rèn)證的問(wèn)題,一般對(duì)用戶校驗(yàn)的時(shí)候,都是對(duì)用戶存在數(shù)據(jù)庫(kù)總的密碼哈希值進(jìn)行判斷,從而避免密碼泄露和反向解密,那么在Python 開(kāi)發(fā)中,我們可以引入bcrypt 或 Passlib 對(duì)系統(tǒng)用戶密碼進(jìn)行哈希和驗(yàn)證處理,以及介紹使用其他類(lèi)庫(kù)實(shí)現(xiàn)常規(guī)加解密處理操作。本篇隨筆主要介紹bcrypt 和 Passlib 它們之間的差異,以及在實(shí)際使用中的一些代碼供參考。

1、bcrypt 和 Passlib的介紹

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

  • bcrypt:

    • bcrypt 是一個(gè)專(zhuān)門(mén)用于實(shí)現(xiàn) bcrypt 哈希算法的庫(kù)。它相對(duì)簡(jiǎn)單,專(zhuān)注于單一功能,即對(duì)密碼進(jìn)行 bcrypt 哈希處理和驗(yàn)證。
    • 適合只需要 bcrypt 哈希算法的場(chǎng)景。
    • 提供的 API 簡(jiǎn)單直接,功能較少。
  • Passlib:

    • Passlib 是一個(gè)更高級(jí)的密碼哈希庫(kù),它支持多種哈希算法(如 bcryptPBKDF2Argon2 等),并且提供了更豐富的功能。
    • 適合需要支持多種密碼哈希算法和策略的場(chǎng)景。
    • 提供的 CryptContext 類(lèi)可以方便地管理和遷移多個(gè)哈希算法。還提供了密碼哈希的自動(dòng)升級(jí)機(jī)制,以及對(duì)舊算法的棄用處理。

當(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)樗峁┝烁嗟呐渲煤桶踩δ堋?/p>

bcrypt: 靈活性較低,因?yàn)樗恢С?nbsp;bcrypt 算法。沒(méi)有多種哈希算法選擇或密碼策略管理功能。使用簡(jiǎn)單,代碼更直觀。如果你只需要 bcrypt 算法,bcrypt 庫(kù)可能更容易上手。

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

示例代碼對(duì)比:

bcrypt 使用示例:

import bcrypt
password = b"supersecretpassword"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
# 驗(yàn)證密碼
if bcrypt.checkpw(password, hashed):
    print("Password matches!")
else:
    print("Password does not match.")

Passlib 使用示例:

from passlib.context import CryptContext
# 創(chuàng)建一個(gè) CryptContext 對(duì)象
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
# 哈希密碼
password = "my_secret_password"
hashed_password = pwd_context.hash(password)
print("Hashed password:", hashed_password)
# 驗(yàn)證密碼
is_correct = pwd_context.verify(password, hashed_password)
if is_correct:
    print("密碼正確")
else:
    print("密碼錯(cuò)誤")

定義了一個(gè) CryptContext 對(duì)象,用于管理密碼哈希算法。schemes=["bcrypt"] 表示你要使用 bcrypt 算法,而 deprecated="auto" 表示自動(dòng)管理過(guò)時(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ǔ)的安全性。例如:

pwd_context = CryptContext(
    schemes=["bcrypt"],
    bcrypt__rounds=12  # bcrypt 的哈希輪數(shù),默認(rèn)為 12
)

2、使用指定的salt進(jìn)行加密

在 Passlib 中,bcrypt 算法默認(rèn)會(huì)自動(dòng)生成一個(gè)隨機(jī)的 salt,這也是 bcrypt 的一種安全特性。如果你想使用指定的 salt 進(jìn)行加密,需要注意的是,Passlib 并不直接支持通過(guò)指定 salt 來(lái)進(jìn)行哈希處理,因?yàn)檫@可能會(huì)降低安全性。

不過(guò),如果你確實(shí)需要使用指定的 salt 進(jìn)行哈希處理,你可以使用以下的方式:

  • 手動(dòng)拼接 salt 和密碼:可以手動(dòng)拼接 salt 和密碼,然后對(duì)結(jié)果進(jìn)行哈希處理。但這種方法僅適用于了解風(fēng)險(xiǎn)并確保安全措施的場(chǎng)景。

  • 使用 bcrypt 庫(kù):直接使用 bcrypt 庫(kù)進(jìn)行處理,它允許你傳遞一個(gè)指定的 salt。不過(guò),注意這會(huì)有一定的安全風(fēng)險(xiǎn)。

1) 使用bcrypt 庫(kù)指定 salt

如果你確實(shí)需要指定 salt,可以使用 bcrypt 庫(kù)。

import bcrypt
# 指定的 salt(必須為 16 字節(jié),前綴為 b"$2b$")
salt = bcrypt.gensalt(rounds=12)  # 或者使用自定義的 16 字節(jié) salt
print(f"Generated salt: {salt}")
# 要加密的密碼
password = "my_secret_password"
# 使用指定的 salt 進(jìn)行加密
hashed_password = bcrypt.hashpw(password.encode('utf-8'), salt)
print(f"Hashed password: {hashed_password}")

2) 手動(dòng)拼接 salt 和密碼

如果你使用 Passlib,并想使用指定的 salt,可以手動(dòng)拼接 salt 和密碼,然后對(duì)這個(gè)組合結(jié)果進(jìn)行哈希處理。這個(gè)方式一般不建議使用,因?yàn)樗茐牧?nbsp;bcrypt 的安全設(shè)計(jì)原則。

from passlib.context import CryptContext
# 創(chuàng)建一個(gè) CryptContext 對(duì)象
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
# 自定義 salt
custom_salt = "my_custom_salt"
# 拼接 salt 和密碼
password = "my_secret_password"
password_with_salt = custom_salt + password
# 對(duì)拼接后的字符串進(jìn)行哈希處理
hashed_password = pwd_context.hash(password_with_salt)
print("Hashed password with custom salt:", hashed_password)

注意事項(xiàng)

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

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

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

  • 自動(dòng)生成的 salt:每次你使用 pwd_context.hash() 生成一個(gè)新的哈希值時(shí),bcrypt 都會(huì)自動(dòng)生成一個(gè)隨機(jī)的 salt 并將其嵌入到生成的哈希值中。因此,即使對(duì)同一個(gè)密碼進(jìn)行多次哈希,每次生成的哈希值也會(huì)不同。

  • 驗(yàn)證過(guò)程:在驗(yàn)證過(guò)程中,pwd_context.verify() 會(huì)自動(dòng)從存儲(chǔ)的哈希值中提取 salt 并重新計(jì)算哈希,然后將其與提供的哈希值進(jìn)行比較。這意味著,即使哈希值不同,驗(yàn)證仍然能夠成功匹配。

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

3、加密和解密處理

Passlib 主要用于密碼哈希處理,并不支持加密和解密操作。如果你需要對(duì)字符串進(jìn)行加密和解密,或者使用非對(duì)稱(chēng)加密,你需要使用其他庫(kù),例如 cryptography 或 PyCryptodome

1)對(duì)稱(chēng)加密和解密

對(duì)于對(duì)稱(chēng)加密,你可以使用 cryptography 庫(kù)中的 Fernet,它是基于 AES 算法的加密方案。

安裝 cryptography 庫(kù)

pip install cryptography

對(duì)稱(chēng)加密和解密示例

from cryptography.fernet import Fernet
# 生成密鑰(注意:密鑰需要安全存儲(chǔ))
key = Fernet.generate_key()
cipher = Fernet(key)
# 加密
message = "This is a secret message"
encrypted_message = cipher.encrypt(message.encode())
print("Encrypted:", encrypted_message)
# 解密
decrypted_message = cipher.decrypt(encrypted_message).decode()
print("Decrypted:", decrypted_message)

2) 非對(duì)稱(chēng)加密和解密

對(duì)于非對(duì)稱(chēng)加密,你可以使用 cryptography 庫(kù)中的 RSA 算法。通常,非對(duì)稱(chēng)加密用于加密較短的信息或加密對(duì)稱(chēng)密鑰。

非對(duì)稱(chēng)加密和解密示例

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
# 生成私鑰和公鑰
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)
public_key = private_key.public_key()
# 加密
message = b"This is a secret message"
encrypted_message = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
print("Encrypted:", encrypted_message)
# 解密
decrypted_message = private_key.decrypt(
    encrypted_message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
print("Decrypted:", decrypted_message.decode())

3)保存和加載密鑰

保存私鑰:

private_pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncryption()
)
with open('private_key.pem', 'wb') as f:
    f.write(private_pem)

加載私鑰:

with open('private_key.pem', 'rb') as f:
    private_key = serialization.load_pem_private_key(
        f.read(),
        password=None,
    )

保存公鑰:

public_pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)
with open('public_key.pem', 'wb') as f:
    f.write(public_pem)

加載公鑰:

with open('public_key.pem', 'rb') as f:
    public_key = serialization.load_pem_public_key(f.read())

我們?cè)陂_(kāi)發(fā)過(guò)程總,可以根據(jù)需求選擇合適的加密方式和庫(kù),并妥善管理密鑰。

到此這篇關(guān)于Python使用bcrypt 或 Passlib 對(duì)系統(tǒng)用戶密碼進(jìn)行哈希和驗(yàn)證處理 的文章就介紹到這了,更多相關(guān)Python用戶密碼哈希和驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python三元運(yùn)算符詳解及典型使用場(chǎng)景

    Python三元運(yùn)算符詳解及典型使用場(chǎng)景

    三元運(yùn)算符是Python中一種簡(jiǎn)潔高效的條件表達(dá)式,可以根據(jù)條件的真假來(lái)返回不同的值,這篇文章主要介紹了Python三元運(yùn)算符詳解及典型使用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • python小巧而強(qiáng)大的網(wǎng)絡(luò)爬蟲(chóng)工具Grab輕松抓取站點(diǎn)信息

    python小巧而強(qiáng)大的網(wǎng)絡(luò)爬蟲(chóng)工具Grab輕松抓取站點(diǎn)信息

    Grab?是一個(gè)強(qiáng)大的?python?網(wǎng)絡(luò)爬蟲(chóng)框架,由?Greg?Lavr?開(kāi)發(fā),它能夠讓你輕松地從互聯(lián)網(wǎng)上抓取所需的信息,Grab?基于?pycurl[1],是性能十分優(yōu)越的一個(gè)?HTTP?客戶端,由于采用了異步網(wǎng)絡(luò)?I/O?模型,Grab?甚至可以并行處理數(shù)千個(gè)網(wǎng)絡(luò)連接
    2024-01-01
  • Python3實(shí)現(xiàn)解析XML文件并存入Excel表中

    Python3實(shí)現(xiàn)解析XML文件并存入Excel表中

    這篇文章主要為大家詳細(xì)介紹了如何使用Python3實(shí)現(xiàn)解析XML文件并存入Excel表中,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2025-12-12
  • Python實(shí)現(xiàn)信息轟炸工具(再也不怕說(shuō)不過(guò)別人了)

    Python實(shí)現(xiàn)信息轟炸工具(再也不怕說(shuō)不過(guò)別人了)

    不知道各位小伙伴有沒(méi)有遇到過(guò)這樣的一個(gè)故事,發(fā)現(xiàn)自己直接噴不過(guò),打字速度不夠給力.下面這篇文章就能解決自己噴不過(guò)的苦惱,話不多說(shuō),上才藝,需要的朋友可以參考下
    2021-06-06
  • Python中實(shí)現(xiàn)三目運(yùn)算的方法

    Python中實(shí)現(xiàn)三目運(yùn)算的方法

    這篇文章主要介紹了Python中實(shí)現(xiàn)三目運(yùn)算的方法,本文用and/or 運(yùn)算符模擬實(shí)現(xiàn)三目運(yùn)算,需要的朋友可以參考下
    2015-06-06
  • python 使用plt畫(huà)圖,去除圖片四周的白邊方法

    python 使用plt畫(huà)圖,去除圖片四周的白邊方法

    今天小編就為大家分享一篇python 使用plt畫(huà)圖,去除圖片四周的白邊方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python學(xué)習(xí)之線程池與GIL全局鎖詳解

    Python學(xué)習(xí)之線程池與GIL全局鎖詳解

    本文我們將學(xué)習(xí)線程池的創(chuàng)建與全局鎖。線程池的創(chuàng)建于進(jìn)程池的原理是相同的;關(guān)于GIL全局鎖,暫時(shí)沒(méi)有代碼上的練習(xí),而是對(duì)其概念進(jìn)行一個(gè)簡(jiǎn)單的啟蒙,感興趣的可以了解一下
    2022-04-04
  • python 并發(fā)編程 阻塞IO模型原理解析

    python 并發(fā)編程 阻塞IO模型原理解析

    這篇文章主要介紹了python 并發(fā)編程 阻塞IO模型原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 用于統(tǒng)計(jì)項(xiàng)目中代碼總行數(shù)的Python腳本分享

    用于統(tǒng)計(jì)項(xiàng)目中代碼總行數(shù)的Python腳本分享

    這篇文章主要介紹了用于統(tǒng)計(jì)項(xiàng)目中代碼總行數(shù)的Python腳本分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-04-04
  • python使用pyodbc連接sqlserver

    python使用pyodbc連接sqlserver

    本文主要介紹了python使用pyodbc連接sqlserver,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02

最新評(píng)論

云安县| 新余市| 万源市| 迁安市| 东兰县| 都兰县| 盖州市| 龙胜| 丰城市| 镇平县| 永川市| 富川| 安康市| 吴堡县| 阳山县| 重庆市| 精河县| 迁安市| 大理市| 汤阴县| 壶关县| 金阳县| 商都县| 西安市| 余姚市| 天全县| 安图县| 海林市| 宜州市| 运城市| 新和县| 宿松县| 镇江市| 徐闻县| 南京市| 崇礼县| 莱州市| 保山市| 南开区| 安化县| 武功县|