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 版被加入.