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



我正在尝试验证从PHP到Node的JWT令牌,但在Node的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在评论中提到的:

无法使用自己的数据(密钥和 JWT(重现问题,即我得到PHP 代码 (5.6.40( 和 NodeJS 代码(10.16.0 和 12.11.1(相同的哈希值(等于 JWT 哈希(。如果您的密钥是测试密钥,则应发布它,以便也可以检查原始数据。您应该重新检查数据(headerB64.payloadB64(和 NodeJS 代码的键。也许这里毕竟有区别。例如,${header}.${payload}是否也是Base64 编码的数据?

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

最新更新