如何解决如何在 Bash 中验证 HTTP HMAC 签名? 更新:更新 2:更新 3:更新 4:
我需要验证我使用的程序的 HTTP HMAC 签名(Drone CI,尝试创建扩展),但我没有尝试让结果匹配。
具体来说,HTTP 请求如下所示:
POST / HTTP/1.1
Host: 127.0.0.1
User-Agent: Go-http-client/1.1
Content-Length: 50
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
Signature: keyId="hmac-key",algorithm="hmac-sha256",signature="signature",headers="accept accept-encoding content-type date digest"
{"data":"data"}
我尝试过使用 sha256sum
、hmac256
和 openssl
,交换 Digest
和 signature
的值,但它们都不是使任何东西都匹配。
更新:
我已经尝试了以下代码,但它似乎仍然不起作用:
MESSAGE='{"data":"data"}'
SECRET="secret" # This isn't any value in the request,is it?
echo -n "${MESSAGE}" | openssl dgst -sha256 -hmac "${SECRET}" | base64 -w 0
更新 2:
HMAC examples on Wikipedia 对我来说工作得很好。我可能会从 HTTP 请求中搞砸什么吗?
如果值得的话,请求签名显然是基于 draft-cavage-http-signatures-10。
更新 3:
我尝试使用以下格式创建签名,但仍然没有骰子:
{"data":"data"}
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_data}
下,以下内容用于尝试(但失败)达到 signature
的值:
echo -n "${hmac_data}" | openssl dgst -sha256 -hmac "${key}" | awk '{print $2}' | base64 -w 0
更新 4:
经过大量的混乱之后,Kiskae's answer 帮我找到了解决方案。
除了他所说的之外,我发现 Drone base64 对字符串的二进制版本进行编码,而不是 ASCII 版本。
因此,上述命令的新版本(与 Drone CI 一起使用时)将如下所示:
${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
还有命令:
echo -n "${MESSAGE}" | openssl dgst -sha256 -hmac "${SECRET}" -binary | base64 -w 0
解决方法
他们似乎在使用 http signatures draft 的实现。
链接的文档解释了需要计算签名的方式以及如何验证它。但这可能是您的示例不起作用的原因:
2.1.3.标题
可选。 headers
参数用于指定列表
生成消息签名时包含的 HTTP 标头。
基本上签名不只包含消息,可能是为了防止重放攻击。由于您只是对消息进行哈希处理,因此它按预期工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。