API 签名机制一篇讲透:md5 签名 + mall_id + tm + appkey 的安全原理
API 签名是防止 mall_id 被盗用的第一道防线。本文讲清 md5(mall_id + 业务参数 + tm + appkey) 签名的原理、5 个常见踩坑、与 HTTPS 的差异。
一句话定义
API 签名 = 用 mall_id + 业务参数 + 时间戳 + appkey 拼成字符串,再做 md5 哈希。 服务器收到请求后用同样的算法算签名,对比客户端传的签名,一致 = 请求合法。
一、为什么需要 API 签名
HTTPS 已经加密传输了,为什么还要签名?
签名 = 防请求篡改 + 防重放 + 防冒用。HTTPS 只解决"加密传输",不解决"请求完整性"。
二、签名的 3 个核心要素
要素 1:mall_id(商户 ID)
要素 2:appkey(签名密钥)
要素 3:tm(时间戳)
三、签名生成原理(以银行卡四要素为例)
步骤 1:准备业务参数
步骤 2:按固定顺序拼接
sign = md5(mall_id + realname + idcard + cardnum + bankPreMobile + tm + appkey)
拼接顺序固定,不含 + 号。这是 1104 签名错误码最常见的踩坑点。
步骤 3:md5 哈希
import hashlib
raw = "MALL001张三1101011990010112346222021234567890123138001380001700000000000your_appkey" sign = hashlib.md5(raw.encode()).hexdigest()
输出 32 位小写 hex 字符串
步骤 4:HTTP POST + sign 参数
POST /v1/bank/verify HTTP/1.1
Content-Type: application/x-www-form-urlencoded
mall_id=MALL001&realname=张三&idcard=110101199001011234&cardnum=6222021234567890123&bankPreMobile=13800138000&tm=1700000000000&sign=a1b2c3d4e5f6...
步骤 5:服务端验证
服务端用同样的参数 + 算法计算签名,与客户端传的 sign 对比:
四、5 个常见踩坑
坑 1:拼接顺序错
症状:返回 1104
原因:不是 mall_id + appkey + tm + 业务参数,而是 mall_id + 业务参数 + tm + appkey
修法:严格按官方文档顺序
坑 2:加了 + 号
症状:返回 1104
原因:字符串里把连接符 + 也算进去了
修法:只拼接值,不含 +
坑 3:tm 用了秒级
症状:返回 1107 时间戳不合法
原因:必须 13 位毫秒(1700000000000),不是 10 位秒(1700000000)
修法:
tm = str(int(time.time() * 1000)) # ✅ 13 位
坑 4:appkey 写在客户端代码里
症状:安全漏洞
原因:appkey 一旦泄露,别人可以伪造你的请求(盗刷余额、冒用身份)
修法:
坑 5:tm 时间窗口太宽
症状:重放攻击成功
原因:服务端允许 ±30 分钟内的请求 → 攻击者截获请求后 30 分钟内可重放
修法:
五、与 HTTPS 的关系
两者不是替代关系,而是互补关系。HTTPS 保证传输安全,签名保证请求完整性。
六、签名机制的局限
七、3 个安全最佳实践
1. appkey 定期轮换
2. IP 白名单
3. 调用频率限制
关于诺正通
诺正通 API 采用统一签名机制:md5(mall_id + 业务参数 + tm + appkey)。 支持 IP 白名单、appkey 轮换、调用频率限制 3 种安全策略。 100 次免费试用,按量计费,具体价格请联系商务。