【问题标题】:NodeJS hmac digest issue with accents带有口音的NodeJS hmac摘要问题
【发布时间】:2012-02-27 10:04:52
【问题描述】:

我正在对以下代码与 Ruby、PHP 和 NodeJS 进行并排比较,使用 crypto 模块在 NodeJS 中得到不正确的响应。

PHP

hash_hmac('sha256', 'text', 'á');

红宝石

OpenSSL::HMAC.hexdigest('sha256', 'á', 'text')

NodeJS

var signer = crypto.createHmac('sha256', 'á');
var expected = signer.update("text").digest('hex');

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

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

JSON.parse(fs.readFileSync('keys.js', 'utf8'));

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

谢谢!

【问题讨论】:

  • 什么版本的节点?在 node v0.6.11 下运行你的示例代码,我得到了你的预期结果。
  • 我在 OSX 10.7 上也有 Node 0.6.11,但 7dc85acba66d21e4394be4f8ead2a327c9f1adc64a99c710c98f60c425bd7411 不是预期的结果。
  • 当然,我得到了34b3ba4ea7e8ff214f2f36b31c6a6d88cfbf542e0ae3b98ba6c0203330c9f55b(在 Ubuntu 上,我的语言环境是 en_US.UTF-8)。
  • 对不起 - 我得到了预期,但只有在复制粘贴上面的源代码之后,在这个过程中修改了à。我在我的源代码中得到á,这会产生您预期的结果(34b3ba4ea7e8ff214f2f36b31c6a6d88cfbf542e0ae3b98ba6c0203330c9f55b)。 ruby 和 php 是怎么做到的,是 utf8 还是其他一些编码?
  • 这很奇怪,无论是在 OSX 还是在 Ubuntu 中,都具有相同的 en_US.UTF-8 语言环境,我是否得到了那个哈希值。

标签: node.js hmac


【解决方案1】:

这段代码会给你正确的结果:

var crypto = require('crypto');

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

【讨论】:

  • 谢谢,这确实有效!你能帮我弄清楚为什么会这样吗?
  • crypto.createHmac 是与 C++ 库的绑定。将 JavaScript 字符串转换为 C++ char* 时出现问题。对所有非单字节字符重复此操作。 Buffer 可以正确地进行这种转换。
猜你喜欢
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 2016-06-24
  • 2020-09-06
  • 2012-09-25
相关资源
最近更新 更多