hmac(Hash-based Message Authentication Code)模块用于生成消息认证码(MAC),以确保数据完整性和身份验证安全性。它结合了哈希算法(如 MD5、SHA256)和密钥,防止数据在传输过程中被篡改,是构建安全通信协议的重要工具。

常见应用场景:

(1)网络请求签名验证(如 API 请求)。

(2)用户数据校验(如 cookie 签名)。

(3)消息认证与防篡改机制。

(4)实现 HMAC-based 身份认证协议(如 OAuth、JWT)。

◆ ◆

核心概念

1、HMAC 原理

将消息(message)与密钥(key)混合,再使用哈希算法生成摘要。即使内容一致,不同密钥也会产生不同结果。

2、不可逆 + 加盐

在哈希的基础上引入密钥(即“盐”),增强安全性并防止“哈希碰撞攻击”。

3、支持多种哈希算法

如 md5, sha1, sha256, sha512 等,底层基于 hashlib。

4、安全比较函数

hmac.compare_digest() 用于避免时序攻击,推荐用于密钥/摘要比对。

◆ ◆

应用举例

例 1:生成 HMAC 签名(默认使用 sha256)

import hmac
import hashlib

key = b'secret_key'
message = b'hello world'

signature = hmac.new(key, message, hashlib.sha256).hexdigest()
print("HMAC 签名(sha256):", signature)

例 2:验证两个 HMAC 是否一致(安全比较)

import hmac
import hashlib

key = b'secret_key'
msg = b'hello world'

sig1 = hmac.new(key, msg, hashlib.sha256).digest()
sig2 = hmac.new(key, msg, hashlib.sha256).digest()

print("签名一致:" , hmac.compare_digest(sig1, sig2))

例 3:使用 sha1 生成较短签名

import hashlib

key = b'key123'
msg = b'important message'

signature = hmac.new(key, msg, hashlib.sha1).hexdigest()
print("HMAC 签名(sha1):", signature)

例 4:HMAC 用于 Webhook 签名验证

import hmac
import hmac
import hashlib

def is_valid_signature(secret, message, signature):
    mac = hmac.new(secret.encode(), message.encode(), hashlib.sha256)
    return hmac.compare_digest(mac.hexdigest(), signature)

# 示例参数
msg = 'event=data'
secret = 'webhook_key'
sig = hmac.new(secret.encode(), msg.encode(), hashlib.sha256).hexdigest()

print("签名验证结果:", is_valid_signature(secret, msg, sig))

例 5:将 HMAC 签名用于 token 加密存储

import hmac
import hashlib
import base64

key = b'session_secret'
token = b'user_id=1001&exp=2025-12-31'

signature = hmac.new(key, token, hashlib.sha256).digest()
token_with_sig = token + b"." + base64.urlsafe_b64encode(signature)

print("带签名的 token:", token_with_sig.decode())

◆ ◆

常用函数速览

hmac.new(key, msg=None, digestmod=None)

创建一个新的 HMAC 对象。

参数

key:密钥(bytes 类型)

msg:要加密的消息(可选,bytes 类型)

digestmod:哈希算法函数,如 hashlib.sha256

返回:HMAC 对象(支持 .update()、.digest()、.hexdigest())

HMAC.update(msg)

向当前 HMAC 对象中追加消息。

参数

msg:追加的消息内容(bytes 类型)

返回:无

HMAC.digest()

返回二进制格式的 HMAC 摘要。

参数:无

返回:bytes 类型

HMAC.hexdigest()

返回十六进制字符串形式的 HMAC 摘要。

参数:无

返回:str 类型

hmac.compare_digest(a, b)

安全比较两个摘要,防止时序攻击。

参数

a, b:两个 bytes 或 str 对象

返回:bool 类型,内容相同为 True,否则 False

◆ ◆

补充说明

1、HMAC 摘要是不可逆的,仅用于验证而非还原原始消息。

2、HMAC 的安全性依赖于密钥的保密性与哈希算法的抗碰撞能力。

3、与对称加密不同,HMAC 不会加密内容,只生成认证签名。

点赞有美意,赞赏是鼓励