【发布时间】: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语言环境,我是否得到了那个哈希值。