【发布时间】:2021-06-10 03:45:13
【问题描述】:
我需要验证我使用的程序的 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 编码的是 binary 版本的字符串,而不是 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
【问题讨论】:
-
暂时忽略 bash,你读过这个吗? stackoverflow.com/questions/18687926/…
-
我检查了它,我想我了解 HMAC 签名的工作原理,但我仍然没有得到任何匹配的结果。
-
@Thomas 我已经添加了一个我在上面尝试过的小脚本,仍然没有任何运气。