在 Python 中,可以使用 HMAC(Hash-based Message Authentication Code)算法来实现客户端对传输数据的签名,以及服务端对签名的校验。HMAC 使用一个密钥(secret)和一个哈希函数(如 SHA256)来生成签名,确保数据的完整性和真实性。
以下是一个简单的示例,展示如何在客户端生成签名,并在服务端进行校验。
客户端生成签名
import hmac
import hashlib
import base64
def generate_signature(secret, data):
# 将数据编码为字节
data_bytes = data.encode('utf-8')
# 将密钥编码为字节
secret_bytes = secret.encode('utf-8')
# 使用 HMAC 和 SHA256 生成签名
signature = hmac.new(secret_bytes, data_bytes, hashlib.sha256).digest()
# 将签名编码为 Base64
return base64.b64encode(signature).decode('utf-8')
# 示例数据和密钥
secret = 'your_secret_key'
data = 'data_to_sign'
# 生成签名
signature = generate_signature(secret, data)
print(f'Signature: {signature}')
服务端校验签名
def verify_signature(secret, data, signature):
# 生成新的签名
expected_signature = generate_signature(secret, data)
# 比较生成的签名和传入的签名
return hmac.compare_digest(expected_signature, signature)
# 示例数据和密钥
secret = 'your_secret_key'
data = 'data_to_sign'
received_signature = signature # 从客户端接收到的签名
# 校验签名
is_valid = verify_signature(secret, data, received_signature)
if is_valid:
print('Signature is valid.')
else:
print('Signature is invalid.')
- 生成签名:
- 使用
hmac.new()
方法生成 HMAC 签名,传入密钥、数据和哈希函数。 - 使用
base64.b64encode()
将生成的字节签名编码为 Base64 字符串,以便于传输。
- 使用
- 校验签名:
- 在服务端,使用相同的密钥和数据生成新的签名。
- 使用
hmac.compare_digest()
方法安全地比较两个签名,防止时间攻击。