hashlib --- 安全雜湊與訊息摘要¶
原始碼:Lib/hashlib.py
該模組實作了許多不同雜湊演算法的通用介面,其中包括 FIPS 安全雜湊演算法 SHA1、SHA224、SHA256、SHA384、SHA512(定義於 FIPS 180-4 標準)、SHA-3 系列(定義於 FIPS 202 標準)以及遺留的 SHA1 演算法(先前為 FIPS 的一部分)和 MD5 演算法(定義於網際網路 RFC 1321)。
備註
如果你需要 adler32 或 crc32 雜湊函式,可以在 zlib 模組中找到它們。
雜湊演算法¶
每種種類的 hash 都有一個以其命名的建構函式方法。全部都會回傳具有相同簡單介面的雜湊物件。例如:可使用 sha256() 來建立 SHA-256 雜湊物件。現在你可以使用 update 方法向此物件提供類位元組物件 (bytes-like objects)(通常是 bytes)。在任何時候,你都可以使用 digest() 或 hexdigest() 方法來要求它提供迄今為止傳遞給它的資料串聯的摘要 (digest)。
為了允許多執行緒 (multithreading),Python GIL 被釋放,同時在其建構函式或 .update 方法中計算一次提供超過 2047 位元組資料的雜湊值。
此模組中始終存在的雜湊演算法之建構函式有 sha1()、sha224()、sha256()、sha384()、sha512()、sha3_224()、sha3_256()、sha3_384()、sha3_512()、shake_128()、shake_256()、blake2b() 和 blake2s()。md5() 通常也可用,但如果你使用罕見的「符合 FIPS (FIPS compliant)」的 Python 建置版本,它可能不存在或者不被允許使用。以上會對應到 algorithms_guaranteed。
如果你的 Python 發行版的 hashlib 與提供其他演算法的 OpenSSL 版本鏈結,也可能有其他演算法可用。其他則不保證可用於在所有安裝上,並且只能以名稱來透過 new() 存取。請參閱 algorithms_available。
警告
某些演算法具有已知的雜湊碰撞 (hash collision) 弱點(包括 MD5 和 SHA1)。請參閱 Attacks on cryptographic hash algorithms 和本文件後面的也參考部分。
在 3.6 版被加入: 新增了 SHA3 (Keccak) 和 SHAKE 建構函式 sha3_224()、sha3_256()、sha3_384()、sha3_512()、shake_128()、shake_256()。也新增了 blake2b() 和 blake2s()。
在 3.9 版的變更: 所有 hashlib 建構函式都採用一個僅限關鍵字引數 (keyword-only argument) usedforsecurity,其預設值為 True。False 值則會允許在受限環境中使用不安全 (insecure) 和阻塞的 (blocked) 雜湊演算法。False 表示雜湊演算法未在安全情境中使用,例如作為一種非加密用途的單向壓縮函式。
在 3.9 版的變更: Hashlib 現在使用 OpenSSL 中的 SHA3 和 SHAKE(如果有提供的話)。
在 3.12 版的變更: 對於鏈結之 OpenSSL 未提供的任何 MD5、SHA1、SHA2 或 SHA3 演算法,我們會回退使用 HACL* 專案中經過驗證的實作。
用法¶
取得位元組字串 b"Nobody inspects the spammish repetition" 的摘要:
>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'
>>> m.hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
更濃縮:
>>> hashlib.sha256(b"Nobody inspects the spammish repetition").hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
建構函式¶
- hashlib.new(name, [data, ]*, usedforsecurity=True)¶
是一個通用建構函式,它將目標演算法的字串 name 作為其第一個參數。它還允許使用者取得上面列出的雜湊值以及 OpenSSL 函式庫可能提供的任何其他演算法。
使用 new() 和演算法名稱:
>>> h = hashlib.new('sha256')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
- hashlib.md5([data, ]*, usedforsecurity=True)¶
- hashlib.sha1([data, ]*, usedforsecurity=True)¶
- hashlib.sha224([data, ]*, usedforsecurity=True)¶
- hashlib.sha256([data, ]*, usedforsecurity=True)¶
- hashlib.sha384([data, ]*, usedforsecurity=True)¶
- hashlib.sha512([data, ]*, usedforsecurity=True)¶
- hashlib.sha3_224([data, ]*, usedforsecurity=True)¶
- hashlib.sha3_256([data, ]*, usedforsecurity=True)¶
- hashlib.sha3_384([data, ]*, usedforsecurity=True)¶
- hashlib.sha3_512([data, ]*, usedforsecurity=True)¶
諸如此類的附名建構函式比將演算法名稱傳遞給 new() 更快。
屬性¶
Hashlib 提供以下常數模組屬性:
- hashlib.algorithms_guaranteed¶
包含所有平台上該模組保證支援的雜湊演算法名稱的集合。請注意,'md5' 有出現在此列表中,儘管有一些上游供應商提供了奇怪的「符合 FIPS (FIPS compliant)」的 Python 建置,並將其排除在外。
在 3.2 版被加入.
- hashlib.algorithms_available¶
包含正在運行的 Python 直譯器中可用的雜湊演算法名稱的集合。這些名稱在傳遞給
new()時將被識別。algorithms_guaranteed都會是它的一個子集。相同的演算法可能會以不同的名稱多次出現在該集合中(多虧了 OpenSSL)。在 3.2 版被加入.
雜湊物件¶
以下的值皆為建構函式回傳之雜湊物件的常數屬性:
- hash.digest_size¶
生成雜湊的大小(以位元組為單位)。
- hash.block_size¶
雜湊演算法的內部區塊大小(以位元組為單位)。
雜湊物件具有以下屬性:
- hash.name¶
該雜湊的規範名稱,都會是小寫,且都會適合作為
new()的參數以建立此型別的另一個雜湊。在 3.4 版的變更: name 屬性自 CPython 誕生以來就存在於其中,但直到 Python 3.4 才正式確立,因此在某些平台上可能不存在。
雜湊物件具有以下方法:
- hash.digest()¶
回傳目前有傳遞給
update()方法的資料之摘要。這是一個大小為digest_size的位元組物件,它可能包含從 0 到 255 的整個範圍內的位元組。
- hash.copy()¶
回傳雜湊物件的副本(「複製 (clone)」),這可用於高效率地計算出共享同一初始子字串的資料之摘要。
SHAKE 可變長度摘要¶
- hashlib.shake_128([data, ]*, usedforsecurity=True)¶
- hashlib.shake_256([data, ]*, usedforsecurity=True)¶
shake_128() 和 shake_256() 演算法提供了可變長度摘要,其 length_in_bits//2 最高為 128 或 256 位元安全性。因此,他們的摘要方法會需要長度。最大長度不受 SHAKE 演算法限制。
- shake.