Python 中的 MD5 雜湊

TJ Lerias 2023年1月30日 2021年7月12日
  1. 什麼是雜湊
  2. 什麼是 MD5
  3. Python hashlib 模組
  4. 在 Python 中使用 MD5 演算法
Python 中的 MD5 雜湊

本文將演示如何使用 Python hashlib 模組使用 MD5 雜湊。

什麼是雜湊

雜湊是一個函式,它獲取可變長度的資料並將其轉換為固定長度。從雜湊函式返回的值稱為雜湊值、雜湊程式碼或摘要。雜湊值通常用於索引稱為雜湊表的固定大小的表。

什麼是 MD5

MD5 訊息摘要演算法是一種流行的雜湊函式,可生成 128 位雜湊值。最初設計為加密雜湊函式,由於存在多個安全問題和漏洞,它現在通常用於驗證資料完整性。

Python hashlib 模組

Python 標準庫包含一個模組,該模組實現了許多不同的安全雜湊和訊息摘要演算法,稱為 hashlib。它還可能包括其他可用的演算法,具體取決於 Python 在你的平臺上使用的 OpenSSL 庫。

要使用雜湊演算法,請匯入 hashlib 模組。

import hashlib

我們現在可以使用該模組支援的雜湊演算法。要檢查正在執行的 Python 直譯器中可用的雜湊演算法,請使用常量屬性 algorithms_available

import hashlib

print(hashlib.algorithms_available)

輸出:

{'md5', 'blake2s', 'sha256', 'sha384', 'sha3_512', 'blake2b', 'md4', 'md5-sha1', 'sha512_224', 'sha224', 'sha3_224', 'ripemd160', 'sha3_256', 'shake_256', 'sm3', 'shake_128', 'sha3_384', 'sha1', 'sha512_256', 'whirlpool', 'sha512'}

上面的列表是 hashlib 中可用的演算法,包括 OpenSSL 的可用演算法

要檢查此模組保證在所有平臺上支援的雜湊演算法,請使用常量屬性 algorithms_guaranteed

import hashlib

print(hashlib.algorithms_guaranteed)

輸出:

{'sha3_256', 'sha256', 'sha3_224', 'sha224', 'blake2s', 'sha3_512', 'shake_128', 'sha512', 'sha3_384', 'shake_256', 'md5', 'blake2b', 'sha384', 'sha1'}
注意
md5algorithms_guaranteed 列表中,但一些 FIPS 相容上游供應商提供了排除它的 Python 構建。

在 Python 中使用 MD5 演算法

要使用 md5 演算法,我們將使用 md5() 建構函式並使用 update() 方法為雜湊物件提供類似位元組的物件,或者將資料作為建構函式的引數傳遞。

要獲取雜湊值,請使用 digest() 方法,該方法返回饋送到雜湊物件的資料的 bytes 物件摘要。

import hashlib

md5_hash = hashlib.md5()
md5_hash.update(b'Hello World')

print(md5_hash.digest())

輸出:

b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'

你也可以將資料作為引數傳遞給建構函式並獲取雜湊值

import hashlib

print(hashlib.md5(b'Hello World').digest())

輸出:

b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'

digest() 方法類似,你也可以使用 hexdigest(),它返回僅包含十六進位制數字的摘要的字串物件。

import hashlib

md5_hash = hashlib.md5()
md5_hash.update(b'Hello World')

print(md5_hash.hexdigest())

輸出:

b10a8db164e0754105b7a99be72e3fe5

請注意,在傳遞給 update() 方法的字串文字之前有一個 b。它用於建立 bytes 型別而不是 str 型別的例項。由於雜湊函式只接受一個位元組序列作為引數。不支援將字串物件傳遞給 update() 方法。

你還可以多次呼叫 update() 方法,這相當於將所有引數連線在一起的單個呼叫。

import hashlib

first_hash = hashlib.md5()
first_hash.update(b'Hello World, Hello Python')
print(first_hash.hexdigest())

second_hash = hashlib.md5()
second_hash.update(b'Hello World,')
second_hash.update(b' Hello Python')
print(second_hash.hexdigest())

輸出:

b0f2921c8c0e63898b0388777908893a
b0f2921c8c0e63898b0388777908893a

總之,我們可以通過 hashlib 模組使用 md5 雜湊演算法,該模組可以通過將資料作為 md5() 建構函式的引數傳遞或使用 update() 方法來提供資料。我們可以使用 digest() 方法獲取雜湊值,該方法返回 digest()hexdigest() 方法的 bytes 物件,該方法返回僅包含十六進位制數字的摘要的字串物件。