python模組之hashlib

當麻的小紅箱發表於2019-02-16

hashlib模組實現了多種安全雜湊和資訊摘要演算法的通用介面,包括FIPS中定義的SHA1, SHA224, SHA256, SHA384, SHA512以及RFC 1321中定義的MD5

注意點:
1. adler32及crc32雜湊由zlib模組提供
2. 某些演算法已知存在雜湊碰撞弱點

雜湊演算法

每個hash演算法都有一個同名的建構函式,並返回擁有相同介面的hash物件

sha1(), sha224(), sha256(), sha384(), sha512(), blake2b()以及blake2s()這些建構函式在hashlib模組中總是可用。md5()通常也可用,但在某些罕見的python版本(“FIPS compliant” build of Python)中例外。取決於所用平臺上python使用的OpenSSL,hashlib也支援某些額外的演算法,在大多數平臺上,sha3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256()都是可用的。

>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b`x03x1exdd}Aex15x93xc5xfe\x00oxa5u+7xfdxdfxf7xbcNx84:xa6xafx0cx95x0fKx94x06`

或者更精簡的方式:

>>> hashlib.sha256(b"Nobody inspects the spammish repetition").digest()
b`x03x1exdd}Aex15x93xc5xfe\x00oxa5u+7xfdxdfxf7xbcNx84:xa6xafx0cx95x0fKx94x06`

hashlib.new(name[, data])

通用建構函式,name參數列示要使用的hash演算法的名稱,可以是上述列出的所有hash演算法以及OpenSSL庫支援的其他演算法。使用演算法名稱建構函式較使用new()更快

>>> h = hashlib.new("sha256", b"Nobody inspects the spammish repetition")
>>> h.digest()
b`x03x1exdd}Aex15x93xc5xfe\x00oxa5u+7xfdxdfxf7xbcNx84:xa6xafx0cx95x0fKx94x06`

hashlib.algorithms_guaranteed

所有平臺的hashlib模組都支援的hash演算法的名稱集合。md5也在此集合中(Note that ‘md5’ is in this list despite some upstream vendors offering an odd “FIPS compliant” Python build that excludes it.)。

hashlib.algorithms_available

當前執行的python直譯器支援的hash演算法的名稱集合,在new()建構函式中使用都能被正確識別。同一演算法可能以不同名稱出現多次。
hashlib.algorithms_guaranteed的結果集總是hashlib.algorithms_available結果集的子集

hash.digest_size

hash物件的位元組長度

hash.block_size

hash物件的內部塊大小

hash.name

hash物件的名稱

hash.update(data)

傳遞類位元組引數(通常是bytes)更新hash物件。重複呼叫update()等同於單次的拼接呼叫:m.update(a); m.update(b)等同m.update(a+b)

從python3.1開始,為了更好的多執行緒效能,使用OpenSSL支援的hash演算法且處理資料量大於2047個位元組的update(或建立)操作發生時,將釋放python全域性直譯器鎖允許其他執行緒執行

hash.digest()

截止此方法呼叫時,update()已接收的資料的摘要,是一個可包含0到255之間所有位元組的位元組物件

hash.hexdigest()

類似於digest(),不過是以雙倍長度的只包含十六進位制數字的字串物件返回摘要值。

hash.copy()

返回hash物件的克隆

SHAKE演算法的可變長度摘要

The shake_128() and shake_256() algorithms provide variable length digests with length_in_bits//2 up to 128 or 256 bits of security

shake.digest(length)

同hash.digest()

shake.hexdigest(length)

同hash.hexdigest()

金鑰匯出

金鑰匯出和擴充套件演算法是為安全密碼雜湊設計的。類似sha1(password)這種簡單演算法不能有效抵禦暴力破解,一個好的密碼雜湊函式必須是可調節的,耗時的,幷包含鹽

hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)

pbkdf2_hmac()提供了使用PKCS#5填充的pbkdf2演算法,使用HMAC作為偽隨機函式。

hash_name表示HMAC的雜湊摘要演算法的名稱,比如”sha1″或”sha256″。

passwordsalt是類位元組物件,password長度應該限制在一個合理範圍之間,salt長度應該在16個位元組以上且來源恰當。

iterations表示迭代次數,基於hash演算法以及機器計算能力設定。截止2013年,sha256演算法建議最少進行10萬次迭代

dklen表示匯出金鑰的長度。預設值為None,使用hash_name演算法計算的hash物件的digest_size屬性長度

>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac(`sha256`, b`password`, b`salt`, 100000)
>>> binascii.hexlify(dk)
b`0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5`

Note: A fast implementation of pbkdf2_hmac is available with OpenSSL. The Python implementation uses an inline version of hmac. It is about three times slower and doesn’t release the GIL.

hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)

The function provides scrypt password-based key derivation function as defined in RFC 7914.

passwordsalt是類位元組物件,password長度應該限制在一個合理範圍之間,salt長度應該在16個位元組以上且來源恰當。

n is the CPU/Memory cost factor, r the block size, p parallelization factor and maxmem limits memory (OpenSSL 1.1.0 defaults to 32 MiB). dklen is the length of the derived key.

BLAKE2

待補充…實在是編不下去了,對加密演算法相關的知識太缺乏了

相關文章