如何在Bash中验证HTTP HMAC签名(Drone CI扩展开发场景)
Drone CI HTTP HMAC签名校验正确实现方案
常见错误原因
- 错误直接对请求体做HMAC计算,未遵循HTTP签名规范
- 拼接签名原串时多加入了请求体内容,且未严格按照
Signature头中headers字段指定的顺序拼接请求头 - 计算HMAC后对十六进制格式的哈希结果做base64编码,而非对二进制HMAC结果直接编码
正确实现步骤
- 从请求
Signature头中提取headers字段指定的请求头列表,示例中为accept accept-encoding content-type date digest - 严格按照列表顺序构造签名原串,每条格式为
[小写头名]: [头值],每条占一行,无多余空格或额外换行
示例原串内容:accept: application/vnd.drone.validate.v1+json accept-encoding: identity content-type: application/json date: Wed, 09 Jun 2021 01:25:07 GMT digest: SHA-256=digest - 使用共享密钥对上述原串做HMAC-SHA256计算,直接取二进制计算结果
- 将二进制结果做base64编码,得到的字符串即可与请求中
Signature头的signature字段值比对
补充:可额外校验
Digest头合法性:将请求体做SHA256哈希后转base64编码,与Digest头中SHA-256=后的内容比对,避免请求体被篡改。
参考Shell计算命令
MESSAGE='accept: application/vnd.drone.validate.v1+json accept-encoding: identity content-type: application/json date: Wed, 09 Jun 2021 01:25:07 GMT digest: SHA-256=digest' SECRET="你的Drone CI共享密钥" echo -n "${MESSAGE}" | openssl dgst -sha256 -hmac "${SECRET}" -binary | base64 -w 0
内容的提问来源于stack exchange,提问作者Hunter Wittenborn
相关产品推荐
相关产品推荐

