带口音的NodeJS hmac摘要问题

Rob*_*rto 8 hmac node.js

我正在与Ruby,PHP和NodeJS并行进行以下代码的比较,使用该crypto模块在NodeJS中获得不正确的响应.

PHP

hash_hmac('sha256', 'text', 'á');
Run Code Online (Sandbox Code Playgroud)

红宝石

OpenSSL::HMAC.hexdigest('sha256', 'á', 'text')
Run Code Online (Sandbox Code Playgroud)

的NodeJS

var signer = crypto.createHmac('sha256', 'á');
var expected = signer.update("text").digest('hex');
Run Code Online (Sandbox Code Playgroud)

Ruby和PHP都返回34b3ba4ea7e8ff214f2f36b31c6a6d88cfbf542e0ae3b98ba6c0203330c9f55b,而NodeJS返回7dc85acba66d21e4394be4f8ead2a327c9f1adc64a99c710c98f60c425bd7411.我注意到,如果我utf8_encode('á')在PHP中尝试,它实际上给了我Node期望的结果.

我正在从文件中加载Node中的重音文本,如下所示:

JSON.parse(fs.readFileSync('keys.js', 'utf8'));
Run Code Online (Sandbox Code Playgroud)

我将如何在Node中更改我的代码以获得PHP和Ruby都存在的结果哈希?

谢谢!

Vad*_*hev 13

此代码将为您提供正确的结果:

var crypto = require('crypto');

var signer = crypto.createHmac('sha256', new Buffer('á', 'utf8'));
var result = signer.update("text").digest('hex');
console.log(result);
Run Code Online (Sandbox Code Playgroud)

  • crypto.createHmac是对C++库的绑定.将JavaScript字符串转换为C++ char*时会出现问题.对所有非单字节字符重复此操作.Buffer可以正确执行此转换. (4认同)