This question already has an answer here:
hmac hash mismatch in PHP and Go

(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))
}

10-04 10:13
查看更多