在 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() 方法安全地比较两个签名,防止时间攻击。