gpt4 book ai didi

node.js - 使用 HMAC 对数据进行 base64 编码的问题

转载 作者:行者123 更新时间:2023-12-05 03:10:29 25 4
gpt4 key购买 nike

我正在尝试使用 Nodejs 生成 XML 消息的 HMAC SHA256、base64 编码签名。我目前使用 PHP 生成签名。

这个过程看起来相当简单,我能够使用 Nodejs 生成 base64 编码的值,但由于某种原因,该值不匹配并且比我使用 PHP 得到的值短得多。

下面,我包含了一个示例 PHP 脚本和结果以及 Nodejs 实现和结果。对于 Nodejs,我使用的是原生加密模块。

// PHP implementation

$xml = <<<EOD
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<record>
<id>1</id>
<first_name>Carlos</first_name>
<last_name>Ruiz</last_name>
<email>cruiz0@engadget.com</email>
<gender>Male</gender>
<ip_address>156.225.191.154</ip_address>
</record>
</dataset>
EOD;

$secret = 'secret';
$sig = base64_encode(hash_hmac('sha256', $xml, $secret));

echo $sig;

结果:ODhkYTc1YmQzNzc0NWUyNDJlNjY3YTY1NzZhYzFhZGYwOTJlMTIxODdjNzYxOWYyNGQxNGExOGVkYTIyZDQ0ZQ==

// Nodejs implementation

var crypto = require('crypto');

fs.readFile('example.xml', 'utf-8', function(err, data) {
function sig(str, key) {
return crypto.createHmac('sha256', key)
.update(str)
.digest('base64');
}
console.log(sig(data, 'secret'));
});

结果:iNp1vTd0XiQuZnpldqwa3wkuEhh8dhnyTRShjtoi1E4=

我花了一天时间试图解决这个问题,在使用 Stack Overflow 一年多之后,这是我的第一个问题。

如有任何帮助,我们将不胜感激!

最佳答案

这里的问题是PHP的hash_hmac()默认返回一个十六进制编码的字符串(见$raw_output参数here),所以你是base64-编码十六进制字符串而不是实际的原始二进制结果。

所以改变这个:

$sig = base64_encode(hash_hmac('sha256', $xml, $secret));

到:

$sig = base64_encode(hash_hmac('sha256', $xml, $secret, true));

关于node.js - 使用 HMAC 对数据进行 base64 编码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39540620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com