引言
在Python中,hmac模塊提供了一種方便的方法來生成HMAC(基於哈希的消息驗證代碼)。HMAC是一種涉及哈希函數和一個秘密密鑰的消息認證碼,對於具有消息認證要求的應用程序而言,它是一種非常有用和安全的演算法。
基本用法
hmac模塊實現了Python中的HMAC演算法,可以用於數據完整性校驗、防篡改等應用。下面我們來看一個基本的示例,用於模擬一個用戶的登錄過程。
import hmac import hashlib def user_login(username, password): # 模擬從資料庫中獲取用戶信息 db_password = 'e10adc3949ba59abbe56e057f20f883e' # 123456的MD5值 key = 'mG8V37MFgqZH1mN9F7k3pEDQ' # 隨機生成的密鑰 if hashlib.md5(password.encode('utf-8')).hexdigest() == db_password: message = '{}:{}:{}'.format(username, db_password, 'login') hmac_md5 = hmac.new(key.encode('utf-8'), message.encode('utf-8'), digestmod=hashlib.md5).hexdigest() return hmac_md5 else: return 'password incorrect' # 模擬登錄過程 username = 'admin' password = '123456' hmac_md5 = user_login(username, password) print('hmac_md5:', hmac_md5)
上面這段示例代碼演示了一個用戶登錄的過程,先從資料庫中獲取用戶的密碼,然後將用戶名、密碼和操作(login)拼成一段字元串。接著使用HMAC演算法計算這個字元串的消息摘要,並返回給用戶。
可以看到,這是一個基本的用法示例,只需要導入hmac和hashlib兩個庫,就可以方便地使用HMAC演算法了。
HMAC的應用
應用一:防止篡改
HMAC可以用於確保數據的完整性,避免數據被篡改。以HTTP請求為例,我們可以在請求中添加一個HMAC簽名,伺服器在接收到請求之後,使用同樣的方式計算HMAC簽名,然後將這個簽名與請求中的簽名進行對比。如果一致,說明數據沒有被篡改;否則說明數據已經被篡改。
import requests import hmac import hashlib url = 'http://api.example.com/userinfo' app_key = 'fnaHFNliU94fWl9a' # 應用的秘鑰 app_secret = 'v9a8sdfaxf9ajv0a89vsdjf98as' # 應用的密鑰 # 構造請求參數 params = { 'app_id': '123456', 'timestamp': '20190101 12:00:00', 'username': 'test', 'password': '123456' } # 計算HMAC簽名 message = '{}\n{}\n{}'.format(params['timestamp'], url, params) signature = hmac.new(app_secret.encode('utf8'), message.encode('utf8'), digestmod=hashlib.sha256).hexdigest() # 添加簽名到請求頭 headers = { 'X-APP-SIGNATURE': signature, } # 發送POST請求 response = requests.post(url, headers=headers, data=params) print('Response:', response.text)
這段示例代碼演示了如何在請求中添加HMAC簽名,並在伺服器端進行驗證。其中,params是請求參數,message是計算HMAC簽名需要的消息體,signature是計算出來的HMAC簽名。將這個簽名添加到請求頭中,發送POST請求,並獲取響應結果。
應用二:加密通信
HMAC也可以和對稱加密演算法一起使用,實現安全的通信。假設有兩個節點A和B要進行通信,它們事先共享一個秘鑰。在通信過程中,首先對明文進行加密(假定使用AES演算法),然後對密文進行計算HMAC,並將HMAC附加到密文中一起發送給對端。對端接收到密文之後,先校驗HMAC的值,如果一致,則說明密文沒有被篡改;否則說明密文已經被篡改。接著再對密文進行解密,獲取明文內容。
import aes import hmac import hashlib # 共享秘鑰 key = 'mG8V37MFgqZH1mN9F7k3pEDQ' # 加密明文 plaintext = b'This is a secret message!' cipher = aes.AESCipher(key, aes.MODE_CBC).encrypt(plaintext) # 計算HMAC並添加到密文中 hmac_md5 = hmac.new(key.encode('utf-8'), cipher, digestmod=hashlib.md5).hexdigest() message = cipher + hmac_md5.encode('utf-8') # 接收端驗證HMAC recv_cipher = message[:len(cipher)] recv_hmac = message[len(recv_cipher):] if hmac.new(key.encode('utf-8'), recv_cipher, digestmod=hashlib.md5).hexdigest() == recv_hmac.decode('utf-8'): plaintext = aes.AESCipher(key, aes.MODE_CBC).decrypt(recv_cipher) print('Plaintext:', plaintext) else: print('HMAC verification failed!')
這段示例代碼演示了使用HMAC演算法與對稱加密演算法共同實現安全通信的過程。首先定義了一個共享秘鑰,然後將待加密的數據進行AES加密,接著使用HMAC演算法計算消息摘要,並將其附加到密文中。通信的另一端接收到數據之後,首先驗證HMAC的值,如果一致,則說明密文沒有被篡改;否則說明數據已經被篡改。接著再對密文進行解密,獲取明文內容。
小結
本文對Python中HMAC的使用方法進行了介紹,從基本用法到實際應用,從防篡改到加密通信,多個方面闡述了HMAC的應用。通過本文的學習,比較全面了解了HMAC的使用方法,對於需要進行數據完整性校驗、數據防篡改、加密通信的應用場景有很大的幫助。
原創文章,作者:TFOXB,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/317408.html