【问题标题】:hmac hash mismatch in PHP and GoPHP 和 Go 中的 hmac 哈希不匹配
【发布时间】:2020-07-08 15:13:12
【问题描述】:

我正在尝试连接到使用过时的 hmac 哈希身份验证机制的 API。

举个例子:

$signature = hash_hmac('sha256', $string_to_sign, $api_sec);

与 Go 中生成的对比:

h := hmac.New(sha256.New, []byte(authSecret))
h.Write([]byte(stringToSign))
signature := hex.EncodeToString(h.Sum(nil))

当我使用相同的 stringToSign($string_to_sign) 和相同的 authSecret($api_sec) 时,使用 Go 生成的签名会导致 API 的签名无效。但是,如果我用 PHP 函数创建相同的函数,它就可以正常工作。我有点迷失在哪里看。

【问题讨论】:

    标签: php go sha256 hmac


    【解决方案1】:

    您的输入数据一定有问题。

    使用下面的 PHP:

    echo hash_hmac('sha256', 'data', 'key');
    

    还有下面的围棋:

    h := hmac.New(sha256.New, []byte("key"))
    h.Write([]byte("data"))
    signature := hex.EncodeToString(h.Sum(nil))
    fmt.Println(signature)
    

    我得到与5031fe3d989c6d1537a013fa6e739da23463fdaec3b70137d828e36ace221bd0 相同的结果

    【讨论】:

    • 是的,这确实有效,但是您认为带有“\n”的字符串有什么不同的含义吗?例如,我正在查看具有“POST\n/path/to/route\nsom=strings”的类似内容,因为只要我有一个带有 \n 字符的字符串,go hash 和 php hash 就会不匹配
    • 回想一下,在 PHP 中,"\n" 将产生一个实际的换行符,而 '\n' 将产生符号 \ ,后跟符号 n,例如字面意思是字符串\n。这将导致您的哈希值有所不同。如果您希望它们都将\n 解释为新行,请在两者中使用"\n"。如果您不希望它们都将\n 解释为新行和文字字符串,请在PHP 中使用'\n',在Go 中使用`\n`
    • 终于可以确定了,查询参数顺序搞砸了导致差异。感谢您指出正确的方向。
    猜你喜欢
    • 2020-10-28
    • 1970-01-01
    • 2016-03-31
    • 2014-10-01
    • 2019-10-10
    • 2014-05-19
    • 2012-10-01
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多