引言
在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的使用方法,对于需要进行数据完整性校验、数据防篡改、加密通信的应用场景有很大的帮助。