Python加密與解密模塊hashlib與hmac
Python的hashlib提供瞭常見的摘要算法,如MD5,SHA1等等。
摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。
MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示。
一、hashlib加密模塊
hash是一種算法(Python3.版本裡使用hashlib模塊代替瞭md5模塊和sha模塊,主要提供 SHA1、SHA224、SHA256、SHA384、SHA512、MD5 算法),該算法接受傳入的內容,經過運算得到一串hash值。
hash值的特點:
- 隻要傳入的內容一樣,得到的hash值一樣,可用於非明文密碼傳輸時密碼校驗
- 不能由hash值返解成內容,即可以保證非明文密碼的安全性
- 隻要使用的hash算法不變,無論校驗的內容有多大,得到的hash值長度是固定的,可以用於對文本的哈希處理
MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示
import hashlib m = hashlib.md5() # 創建md5對象 b = 'hello'.encode(encoding='utf-8') # 此處必須encode, 或者 b = bytes(str, encoding='utf-8'),作用相同都是encode為bytes,將str默認的unicode轉成utf-8. m.update(b); #該方法隻接受bytes類型 print(m.hexdigest()) #將hash中的數據轉換成數據,其中隻包含十六進制的數字。 5d41402abc4b2a76b9719d911017c592 # 另一種寫法:b‘'前綴代表的就是bytes ,對英文加密,才可以使用b' '前綴,b' '在python中隻能對ASCII字符進行轉碼。 str_md5 = hashlib.md5(b'this is a md5 test.').hexdigest() print('MD5加密後為 :' + str_md5)
如果數據量很大,可以分塊多次調用update()
,最後計算的結果是一樣的。
SHA1的生成結果是160 bit字節,通常用一個40位的16進制字符串表示。
比SHA1更安全的算法是SHA256和SHA512,不過越安全的算法不僅越慢,而且摘要長度更長。
二、hmac 加鹽加密模塊
Python自帶的hmac模塊實現瞭標準的Hmac算法:Keyed-Hashing for Message Authentication。它通過一個標準算法,在計算哈希的過程中,把key混入計算過程中。它內部對我們創建key和內容做過某種處理後再加密。
和我們自定義的加salt算法不同,Hmac算法針對所有哈希算法都通用,無論是MD5還是SHA-1。采用Hmac替代我們自己的salt算法,可以使程序算法更標準化,也更安全。
我們來看看如何使用hmac實現帶key的哈希。
我們首先需要準備待計算的原始消息message,隨機key,哈希算法,這裡采用MD5,使用hmac的代碼如下:
import hmac message = b'Hello, world!' key = b'secret' h = hmac.new(key, message, digestmod='MD5') # 如果消息很長,可以多次調用h.update(msg) h.hexdigest() # 'fa4ee7d173f2d97ee79022d1a7355bcf'
註意:要註意傳入的key和message都是bytes
類型,str
類型需要首先編碼為bytes
。
def hmac_md5(key, s): return hmac.new(key.encode('utf-8'), s.encode('utf-8'), 'MD5').hexdigest()
如果要保證hmac模塊最終結果一致,必須保證:
- hmac.new括號內指定的初始key一樣
- 無論update多少次,校驗的內容累加到一起是一樣的內容
import hashlib import hmac # 註意hmac模塊隻接受二進制數據的加密 h1 = hmac.new(b'hash', msg=None, digestmod=hashlib.md5) h1.update(b'hello') h1.update(b'world') print(h1.hexdigest()) # 905f549c5722b5850d602862c34a763e h2 = hmac.new(b'hash', msg=None, digestmod=hashlib.md5) h2.update(b'helloworld') print(h2.hexdigest()) # 905f549c5722b5850d602862c34a763e h3 = hmac.new(b'hashhelloworld', msg=None, digestmod=hashlib.md5) print(h3.hexdigest()) # a7e524ade8ac5f7f33f3a39a8f63fd25
到此這篇關於Python加密與解密的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Python中hash加密簡介及使用方法
- Python 常見加密操作的實現
- 盤點Python 爬蟲中的常見加密算法
- python密碼學各種加密模塊教程
- 利用 Python 中的內置open函數讀取二進制文件