API签名通过密钥与参数结合HMAC-SHA256算法生成摘要,保障
API 签名详解
API 签名的定义
API 签名是通过加密算法对 API 请求参数进行哈希计算,生成一段固定长度的字符串(签名),用于验证请求的完整性和真实性,其核心目的是防止请求被篡改,并确认请求发送方的身份。
签名原理
- 参数标准化
将请求参数按特定规则排序(如字典序),避免因参数顺序不同导致签名差异。 - 拼接签名字符串
将标准化后的参数及其值拼接成字符串(如key1=value1&key2=value2
),并加入密钥(Secret Key)或其他上下文信息(如时间戳)。 - 加密生成签名
对拼接后的字符串进行哈希计算(如 HMAC-SHA256)或加密算法(如 RSA),生成最终的签名。 - 传输与验证
将签名作为请求头或参数发送至服务器,服务器用相同算法生成签名并与客户端发送的签名比对,一致则通过验证。
签名生成步骤
步骤 | 操作 | 示例 |
---|---|---|
参数排序 | 按字典序排列参数 | b=2&a=1 → a=1&b=2 |
拼接字符串 | 格式:参数1=值1&参数2=值2 | a=1&b=2&secret=abc |
添加密钥 | 在字符串末尾追加 Secret Key | a=1&b=2&secret=abc + secret_key=xyz → a=1&b=2&secret=abc&secret_key=xyz |
生成签名 | 对最终字符串进行哈希计算 | HMAC-SHA256("a=1&b=2&secret=abc&secret_key=xyz") → e7c8... |
传输签名 | 将签名加入请求头或参数 | Authorization: Sign e7c8... |
常见签名算法对比
算法类型 | 特点 | 适用场景 |
---|---|---|
HMAC-SHA1 | 速度快,安全性较低(不抗碰撞) | 低安全要求的内部接口 |
HMAC-SHA256 | 安全性高,抗碰撞能力强 | 大多数开放 API 默认选择 |
RSA/DSA | 非对称加密,需公私钥配对 | 金融级、高安全需求场景 |
MD5(不推荐) | 速度最快,但已被破解 | 仅历史兼容场景 |
签名示例(Python)
import hmac import hashlib import base64 def generate_signature(params, secret_key): # 1. 参数标准化(字典序排序) sorted_params = sorted(params.items()) # 2. 拼接字符串(URL编码) param_str = "&".join([f"{k}={v}" for k, v in sorted_params]) # 3. 添加密钥 sign_str = f"{param_str}&secret_key={secret_key}" # 4. HMAC-SHA256 加密 signature = hmac.new(secret_key.encode(), sign_str.encode(), hashlib.sha256).digest() # 5. Base64 编码(可选) return base64.b64encode(signature).decode() # 示例调用 params = {"a": "1", "b": "2"} secret_key = "xyz" print(generate_signature(params, secret_key)) # 输出类似 "XlO...=="
相关问题与解答
问题1:API 签名失败的可能原因有哪些?
解答:
- 参数顺序错误:未按约定规则排序参数。
- 密钥泄露或错误:客户端与服务器的 Secret Key 不一致。
- 编码问题:参数未正确 URL 编码或 Base64 编码。
- 时间戳过期:若签名包含时间戳,服务器校验时可能已超时。
- 哈希算法不一致:客户端与服务器使用不同算法(如 HMAC-SHA1 vs HMAC-SHA256)。
问题2:如何防止 API 签名被重放攻击?
解答:
- 加入时间戳:在签名字符串中添加当前时间戳(如 Unix 时间),服务器校验时间差(如允许 5 分钟内)。
- 使用一次性随机数(Nonce):每次请求生成唯一随机数并参与签名,服务器记录已使用的 Nonce。
- 限制 IP 或频率:对同一 IP
到此,以上就是小编对于“api 签名”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复