Python3?hashlib?模塊基本用法詳解
在 Python3 中,hashlib模塊提供了一系列加密哈希算法的實現(xiàn),用于計算數(shù)據(jù)的哈希值。哈希算法(又稱散列算法)通過將任意長度的輸入數(shù)據(jù)轉(zhuǎn)換為固定長度的輸出(哈希值),具有單向性(無法從哈希值反推原始數(shù)據(jù))和唯一性(不同數(shù)據(jù)大概率產(chǎn)生不同哈希值)的特點,常用于數(shù)據(jù)校驗、密碼存儲、數(shù)字簽名等場景。
一、基本用法
hashlib的核心流程是:創(chuàng)建哈希對象 → 更新數(shù)據(jù) → 獲取哈希值。
關(guān)鍵說明:
- 哈希算法處理的是字節(jié)數(shù)據(jù)(bytes),因此字符串需先通過
encode()編碼為 bytes(如utf-8)。 - 可通過
update()多次傳入數(shù)據(jù),最終計算的是所有數(shù)據(jù)的總哈希值(適合分塊處理大數(shù)據(jù))。 - 哈希值可通過
digest()(返回 bytes 類型)或hexdigest()(返回十六進制字符串,更易讀)獲取。
二、常用哈希算法及示例
hashlib支持多種主流算法,如md5、sha1、sha256、sha512等(安全性:sha512 > sha256 > sha1 > md5)。
1. MD5
import hashlib
# 1. 創(chuàng)建MD5哈希對象
md5_hash = hashlib.md5()
# 2. 更新數(shù)據(jù)(需傳入bytes類型)
data = "hello world"
md5_hash.update(data.encode("utf-8")) # 字符串編碼為bytes
# 3. 獲取哈希值(十六進制字符串)
print(md5_hash.hexdigest()) # 輸出:5eb63bbbe01eeed093cb22bb8f5acdc32. SHA-256
import hashlib # 直接傳入bytes數(shù)據(jù)(b前綴表示bytes) sha256_hash = hashlib.sha256(b"hello world") # 獲取哈希值 print(sha256_hash.hexdigest()) # 輸出:a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e44b0
3. 分塊更新數(shù)據(jù)(適合大文件)
對于大文件或流式數(shù)據(jù),可分多次調(diào)用update()累積數(shù)據(jù),避免一次性加載到內(nèi)存:
import hashlib
def calculate_file_hash(file_path, algorithm="sha256"):
# 創(chuàng)建指定算法的哈希對象(通過hashlib.new()支持動態(tài)指定算法)
hash_obj = hashlib.new(algorithm)
# 分塊讀取文件并更新哈希
with open(file_path, "rb") as f:
while chunk := f.read(4096): # 每次讀取4096字節(jié)(可調(diào)整)
hash_obj.update(chunk)
return hash_obj.hexdigest()
# 示例:計算某文件的SHA-256哈希
print(calculate_file_hash("large_file.zip")) # 輸出文件的哈希值三、重要屬性與方法
| 方法 / 屬性 | 說明 |
|---|---|
hashlib.new(algorithm) | 創(chuàng)建指定算法的哈希對象(如new("sha3_256")) |
update(data) | 向哈希對象傳入數(shù)據(jù)(data 必須為 bytes) |
digest() | 返回 bytes 類型的哈希值 |
hexdigest() | 返回十六進制字符串類型的哈希值 |
digest_size | 哈希值的字節(jié)長度(如 SHA-256 為 32 字節(jié)) |
block_size | 算法的塊大?。ㄓ糜趦?nèi)部計算) |
algorithms_available | 系統(tǒng)支持的所有哈希算法列表 |
algorithms_guaranteed | 所有 Python 環(huán)境都保證支持的算法列表 |
四、注意事項
- 安全性:
MD5和SHA1已被證明存在安全漏洞,不推薦用于密碼存儲、數(shù)字簽名等安全場景,建議使用SHA-256、SHA-512或更先進的SHA3系列。 - 數(shù)據(jù)類型:必須傳入 bytes 類型數(shù)據(jù),字符串需先編碼(如
str.encode("utf-8")),否則會報錯。 - 哈希碰撞:理論上不同數(shù)據(jù)可能產(chǎn)生相同哈希值(碰撞),但好的算法(如 SHA-256)碰撞概率極低,可忽略。
五、擴展:帶密鑰的哈希(HMAC)
hashlib常與hmac模塊配合使用,實現(xiàn)帶密鑰的哈希(HMAC),用于身份驗證等場景(如 API 簽名):
import hmac import hashlib key = b"my_secret_key" # 密鑰(bytes類型) data = b"hello world" # 待加密數(shù)據(jù) # 計算HMAC-SHA256 hmac_obj = hmac.new(key, data, digestmod=hashlib.sha256) print(hmac_obj.hexdigest()) # 輸出帶密鑰的哈希值
通過hashlib,可以便捷地實現(xiàn)數(shù)據(jù)哈希計算,滿足數(shù)據(jù)校驗、安全存儲等需求。實際使用時需根據(jù)場景選擇合適的算法,并注意數(shù)據(jù)類型和安全性要求。
到此這篇關(guān)于Python3 hashlib 模塊的文章就介紹到這了,更多相關(guān)Python hashlib 模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pycharm的debug調(diào)試以及異常,Python中錯誤的處理過程
這篇文章主要介紹了pycharm的debug調(diào)試以及異常,Python中錯誤的處理過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Python實現(xiàn)識別手寫數(shù)字 Python圖片讀入與處理
這篇文章主要為大家詳細介紹了Python實現(xiàn)識別手寫數(shù)字,Python圖片的讀入與處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
django認證系統(tǒng)實現(xiàn)自定義權(quán)限管理的方法
這篇文章主要介紹了django認證系統(tǒng)實現(xiàn)自定義權(quán)限管理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
詳解Python的Django框架中的模版相關(guān)知識
這篇文章主要介紹了Python的Django框架中的模版相關(guān)知識,模版的存在大大簡化了創(chuàng)作頁面時HTML的相關(guān)工作,需要的朋友可以參考下2015-07-07
Django網(wǎng)絡(luò)框架之創(chuàng)建虛擬開發(fā)環(huán)境操作示例
這篇文章主要介紹了Django網(wǎng)絡(luò)框架之創(chuàng)建虛擬開發(fā)環(huán)境操作,簡單描述了虛擬開發(fā)環(huán)境的概念、功能,并分析了使用venv與virtualenv安裝虛擬環(huán)境相關(guān)操作技巧,需要的朋友可以參考下2019-06-06

