翻譯自 這裡 Preface : New in version 2.5. Source code: Lib/hashlib.py 這個模組提供了許多常用 message digest 演算法. 包含了 FIPS secure hash SHA1, SHA224, SHA256, SHA384, 與 SHA512 (defined in FIPS 180-2). 另外還有 RSA 的 MD5 (RFC 1321) 等. 如果你需要的是 adler32 與 crc32 演算法, 可以參考 zlib 模組. Usage : 這些演算法的使用方法類似, 首先會需要呼叫一個建構用的函式並返回對應演算法的物件, 如呼叫 sha1() 會產生一個 SHA1 hash 物件. 接著呼叫該物件上的方法 update() 並傳入欲計算的 string (可以連續呼叫並傳入多個 string). 最後便是呼叫 digest() 或 hexdigest() 傳回計算結果. 底下為 SAH1 計算的簡單範例 :
>>> import hashlib
>>> m = hashlib.sha1()
>>> m.update("Nobody inspects".encode())
>>> m.update(" the spammish repetition".encode())
>>> m.digest()
b'S\x1b\x07\xa0\xf5\xb6dw\xa2\x17B\xd2\x82qv&OK\xbf\xe2'
>>> m.digest_size
20
>>> m.block_size
64
更簡潔的寫法可以如下使用 :
>>> hashlib.sha1("Nobody inspects the spammish repetition".encode()).hexdigest()
'531b07a0f5b66477a21742d2827176264f4bbfe2'
還有另一種用法是透過方法 new() 並傳入演算法的名稱如 sha1, md5 等 (支援種類由 OpenSSL library 決定), 並回傳對應的演算法物件 :
>>> h = hashlib.new('sha1')
>>> h.update('Nobody inspects the spammish repetition'.encode())
>>> h.hexdigest()
'531b07a0f5b66477a21742d2827176264f4bbfe2'
實用客製函數 CalDigest() : 因為工作需求, 自己寫了一個簡單模組快速計算某個 Hex 字串的 hash 或 digest :
- DigestCal.py :
- import hashlib
-
- def CalDigest( hexStr, sep=None ,type="sha1"):
- """
- Calculate the digest/hash value of given hex string based on different algorithm indicated by 'type'.
- """
- hexStr = ''.join(hexStr.split(" "))
- if (len(hexStr)%2) == 0:
- hobj = hashlib.new(type)
- hobj.update(HexToByte(hexStr).encode())
- digHex = hobj.hexdigest().upper()
- if sep:
- bytes = []
- for i in range(0, len(digHex), 2):
- bytes.append(digHex[i:i+2])
- return sep.join(bytes)
- else:
- return digHex
- else:
- print("\t[Info] Illegal Hex String={0}".format(hexStr))
-
- def HexToByte( hexStr ):
- """
- Convert a string hex byte values into a byte string. The Hex Byte values may
- or may not be space separated.
- """
- # The list comprehension implementation is fractionally slower in this case
- #
- # hexStr = ''.join( hexStr.split(" ") )
- # return ''.join( ["%c" % chr( int ( hexStr[i:i+2],16 ) ) \
- # for i in range(0, len( hexStr ), 2) ] )
-
- bytes = []
-
- hexStr = ''.join( hexStr.split(" ") )
-
- for i in range(0, len(hexStr), 2):
- bytes.append( chr( int (hexStr[i:i+2], 16 ) ) )
-
- return ''.join( bytes )
接著你便可以進入 interactive mode 並載入模組, 使用如下 :
>>> import DigestCal # 組入模組 DigestCal
>>> DigestCal.CalDigest("01 02 03") # 計算 byte 0x01 0x02 0x03 三個 bytes 的 SHA1
'7037807198C22A7D2B0807371D763779A84FDFCF'
>>> DigestCal.CalDigest("01 02 03", sep=' ') # 使用 ' ' 區隔每一個 byte
'70 37 80 71 98 C2 2A 7D 2B 08 07 37 1D 76 37 79 A8 4F DF CF'
>>> DigestCal.CalDigest("01 02 03", sep='-', type='md5') # 改用 MD5 來計算, 並使用 '-' 區隔每一個 byte
'52-89-DF-73-7D-F5-73-26-FC-DD-22-59-7A-FB-1F-AC'
Supplement : * Byte to Hex and Hex to Byte String Conversion (Python recipe)
沒有留言:
張貼留言