NodeJS crypto.createHmac 的结果与 PHP 的 hash_hmac 不同

NodeJS crypto.createHmac doesn't have the same result as PHP's hash_hmac

我正在尝试验证从 PHP 到节点的 JWT 令牌,但在节点 crypto.createHmac 中获取令牌的签名值时失败。两者使用相同的密钥

要验证的 JWT 令牌:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTg3fQ.HWVnV0i9dtHdS4snqCSDkgLjCdvnTYQ2d3t7I834C9s

PHP:

base64_encode(hash_hmac("sha256", "$headb64.$bodyb64", $someSecretKey, true))

结果

HWVnV0i9dtHdS4snqCSDkgLjCdvnTYQ2d3t7I834C9s=

但在节点中

crypto.createHmac("sha256", Buffer.from(process.env.SOME_SECRET_KEY))
        .update(`${header}.${payload}`)
        .digest('base64')

我得到了

ryvyuqcW_GbVhPNBAyW8fGR1i911Jh_FFsNIPf1DJOc=

我知道有很多问题与此相同,但他们的解决方案不适用于我。我多次用谷歌搜索这个问题但都失败了,创建一个问题是我最后的手段。我正在使用 PHP 5.6 和 Node v12.13.1.

有什么解决办法吗?谢谢。

正如@Topaco 在评论中提到的那样:

I cannot reproduce the problem with my own data (key and JWT), i.e. I get the same hash (which equals the JWT hash) with both the PHP code (5.6.40) and the NodeJS code (10.16.0 and 12.11.1). If your key is a test key it should be posted so that the original data can also be checked. You should re-check the data (headerB64.payloadB64) and the key of the NodeJS code. Maybe there is a difference here after all. E.g. are ${header}.${payload} also the Base64 encoded data?

问题出在密钥上。我非常有信心 PHP 在环境变量中使用密钥,但当我检查它不是时,密钥被硬编码在配置文件中。