您的位置:

Python中hmac的使用方法

引言

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