每周一个 Python 模块 | hashlib
專欄地址:每周一個 Python 模塊
hashlib 模塊定義了用于訪問不同加密散列算法的 API。要使用特定的哈希算法,需要先用適當的構造函數或new()創建哈希對象。然后,無論使用何種算法,對象都使用相同的 API。
散列算法
由于hashlib 受 OpenSSL “支持”,因此該庫提供的所有算法都可用,包括:
- MD5
 - SHA1
 - SHA224
 - SHA256
 - SHA384
 - SHA512
 
有些算法可用于所有平臺,有些算法依賴于底層庫。對于每個列表,分別查看 algorithms_guaranteed 和algorithms_available 函數。
import hashlibprint('Guaranteed:\n{}\n'.format(', '.join(sorted(hashlib.algorithms_guaranteed)))) print('Available:\n{}'.format(', '.join(sorted(hashlib.algorithms_available))))# output # Guaranteed: # blake2b, blake2s, md5, sha1, sha224, sha256, sha384, sha3_224, # sha3_256, sha3_384, sha3_512, sha512, shake_128, shake_256 # # Available: # BLAKE2b512, BLAKE2s256, MD4, MD5, MD5 - SHA1, RIPEMD160, SHA1, # SHA224, SHA256, SHA384, SHA512, blake2b, blake2b512, blake2s, # blake2s256, md4, md5, md5 - sha1, ripemd160, sha1, sha224, sha256, # sha384, sha3_224, sha3_256, sha3_384, sha3_512, sha512, # shake_128, shake_256, whirlpool 復制代碼樣本數據
本節中的所有示例都使用相同的示例數據:
# hashlib_data.py import hashliblorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.''' 復制代碼MD5示例
要計算數據塊(此處為轉換為字節字符串的 unicode 字符串)的 MD5 哈希或摘要,首先創建哈希對象,然后添加數據并調用 digest() 或 hexdigest()。
import hashlibfrom hashlib_data import loremh = hashlib.md5() h.update(lorem.encode('utf-8')) print(h.hexdigest()) # 3f2fd2c9e25d60fb0fa5d593b802b7a8 復制代碼此例使用 hexdigest() 方法而不是 digest(),因為輸出已格式化,因此可以清晰地打印。如果二進制摘要值可以接受,請使用digest()。
SHA1示例
SHA1 摘要以相同的方式計算。
import hashlibfrom hashlib_data import loremh = hashlib.sha1() h.update(lorem.encode('utf-8')) print(h.hexdigest()) # ea360b288b3dd178fe2625f55b2959bf1dba6eef 復制代碼摘要值在此示例中是不同的,因為算法從 MD5 更改為 SHA1。
按名稱創建哈希
有時,在字符串中按名稱引用算法比通過直接使用構造函數更方便。例如,將哈希類型存儲在配置文件中。在這種情況下,用 new() 創建哈希對象。
# hashlib_new.py import argparse import hashlib import sysfrom hashlib_data import loremparser = argparse.ArgumentParser('hashlib demo') parser.add_argument('hash_name',choices=hashlib.algorithms_available,help='the name of the hash algorithm to use', ) parser.add_argument('data',nargs='?',default=lorem,help='the input data to hash, defaults to lorem ipsum', ) args = parser.parse_args()h = hashlib.new(args.hash_name) h.update(args.data.encode('utf-8')) print(h.hexdigest())# output # $ python3 hashlib_new.py sha1 # ea360b288b3dd178fe2625f55b2959bf1dba6eef # # $ python3 hashlib_new.py sha256 # # 3c887cc71c67949df29568119cc646f46b9cd2c2b39d456065646bc2fc09ffd8 # # $ python3 hashlib_new.py sha512 # # a7e53384eb9bb4251a19571450465d51809e0b7046101b87c4faef96b9bc904cf7f90 # 035f444952dfd9f6084eeee2457433f3ade614712f42f80960b2fca43ff # # $ python3 hashlib_new.py md5 # # 3f2fd2c9e25d60fb0fa5d593b802b7a8 復制代碼增量更新
update() 可以重復調用哈希計算器的方法。每次,摘要都會根據輸入的附加文本進行更新。逐步更新比將整個文件讀入內存更有效,并產生相同的結果。
import hashlibfrom hashlib_data import loremh = hashlib.md5() h.update(lorem.encode('utf-8')) all_at_once = h.hexdigest()def chunkize(size, text):"Return parts of the text in size-based increments."start = 0while start < len(text):chunk = text[start:start + size]yield chunkstart += sizereturnh = hashlib.md5() for chunk in chunkize(64, lorem.encode('utf-8')):h.update(chunk) line_by_line = h.hexdigest()print('All at once :', all_at_once) # All at once : 3f2fd2c9e25d60fb0fa5d593b802b7a8 print('Line by line:', line_by_line) # Line by line: 3f2fd2c9e25d60fb0fa5d593b802b7a8 print('Same :', (all_at_once == line_by_line)) # Same : True 復制代碼相關文檔:
pymotw.com/3/hashlib/i…
總結
以上是生活随笔為你收集整理的每周一个 Python 模块 | hashlib的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 榴莲还有奶油、花生味 印尼出新品售价近7
 - 下一篇: 08函数的参数 进阶