This question already has an answer here:
hmac hash mismatch in PHP and Go
(1个答案)
3个月前关闭。
我正在尝试生成用于API身份验证的hmac,但是文档在Go上,我需要将其转换为php方式,我需要将结果与Go结果相同。
在Docs上说:要构建要签名的字符串,请将HTTP方法,请求内容类型,日期时间,请求URI和有效负载哈希与每个参数之间的换行符结合使用。
走开:
GO中的Hmac:6k44vpeNqYSgFkM2sZsJH + Ijg5amftPnqO3v45pMWN0 =
我在PHP中尝试过的东西:
PHP中的Hmac:9mt4Ojzr9uVGaB6 / jt96bbuEd0gJNh6Cph3q + dY3X38 =
我在这里有点迷路,已经花了很多时间来解决这个问题,请帮忙。
(1个答案)
3个月前关闭。
我正在尝试生成用于API身份验证的hmac,但是文档在Go上,我需要将其转换为php方式,我需要将结果与Go结果相同。
在Docs上说:要构建要签名的字符串,请将HTTP方法,请求内容类型,日期时间,请求URI和有效负载哈希与每个参数之间的换行符结合使用。
走开:
func ComputeHMAC(date string) string
request := []string{"POST","application/json",'Thu, 17 Jan 2019 02:45:06
GMT',"/ayden/init",'qz0HpayQzMDnBfJMfUB5zJGU62nX2Uef66m6YIpDAWA='}
request1 := strings.Join(request, "\n")
request2 := []string{request1,"\n"}
stringToSign := strings.Join(request2, "")
shaSignature := computeHmac256(stringToSign, "secret")
}
func computeHmac256(message string, secret string) string {
key := []byte(secret)
h := hmac.New(sha256.New, key)
h.Write([]byte(message))
result := h.Sum(nil)
return base64.StdEncoding.EncodeToString(result)
}
GO中的Hmac:6k44vpeNqYSgFkM2sZsJH + Ijg5amftPnqO3v45pMWN0 =
我在PHP中尝试过的东西:
$stringToSign = [
'POST',
'application/json',
'Thu, 17 Jan 2019 02:45:06 GMT',
'/ayden/init',
'qz0HpayQzMDnBfJMfUB5zJGU62nX2Uef66m6YIpDAWA='
];
$string = implode("/n", $stringToSign);
$hmac = base64_encode(hash_hmac('sha256', $string, 'secret', true));
echo $hmac;
PHP中的Hmac:9mt4Ojzr9uVGaB6 / jt96bbuEd0gJNh6Cph3q + dY3X38 =
我在这里有点迷路,已经花了很多时间来解决这个问题,请帮忙。
最佳答案
你可以试试这个功能
func computeHmac256(src string, secret string) string {
h := hmac.New(sha256.New, []byte(secret))
h.Write([]byte(src))
shaStr:= fmt.Sprintf("%x",h.Sum(nil))
return base64.StdEncoding.EncodeToString([]byte(shaStr))
}