节点JSencryption,不能创build带有重音的字符的hmac

当我试图encryption的文本有重音字符(如ä,ï,ë)时,我在NodeJS中使用crypto.js生成正确的签名时遇到问题。

generateSignature = function (str, secKey) { var hmac = crypto.createHmac('sha1', secKey); var sig = hmac.update(str).digest('hex'); return sig; }; 

如果'str'不包含重音字符(字符如ä,ï,ë),此函数将返回正确的HMAC签名。 如果文本中有重音字符,则不会返回正确的HMAC。 重音字符在UTF8编码是有效的,所以我不知道为什么encryption与他们有问题。 可能是这样,我需要以某种方式告诉encryption,我正在签署utf8编码的文本,但我不知道如何做到这一点。

在这篇文章中描述了完全相同的问题: NodeJS hmac摘要问题与口音然而,post本身以及答案对我来说是没有意义的(因为他们正在传递他们想要encryption的数据,走)。

以下是str和secKey的硬编码值的一个版本:

  var crypto = require('crypto'); str="äïë"; secKey="secret"; var hmac = crypto.createHmac('sha1', secKey); var sig = hmac.update(new Buffer(str, 'utf8')).digest('hex'); console.log("Sig: " + sig); console.log("Expected: 094b2ba039775bbf970a58e4a0a61b248953d30b"); // "Expected" was generated using http://hash.online-convert.com/sha1-generator 

输出::

信号:39c9f1a6094c76534157739681456e7878557f58

预计:094b2ba039775bbf970a58e4a0a61b248953d30b

谢谢

crypto模块使用的默认编码通常是'binary' 。 所以,你必须通过Buffer指定'utf-8'来使用它作为编码:

 var sig = hmac.update(new Buffer(str, 'utf-8')).digest('hex'); 

这就是另一个问题的答案所certificate的,仅仅是关键:

 var hmac = crypto.createHmac('sha1', new Buffer(secKey, 'utf-8')); 

您也可以使用Buffer查看差异:

 new Buffer('äïë', 'binary') // <Buffer e4 ef eb> new Buffer('äïë', 'utf-8') // <Buffer c3 a4 c3 af c3 ab> 

[ 编辑 ]

运行你提供的示例代码,我得到:

 Sig: 094b2ba039775bbf970a58e4a0a61b248953d30b Expected: 094b2ba039775bbf970a58e4a0a61b248953d30b 

而且,稍微修改它,我会得到true

 var crypto = require('crypto'); function sig(str, key) { return crypto.createHmac('sha1', key) .update(new Buffer(str, 'utf-8')) .digest('hex'); } console.log(sig('äïë', 'secret') === '094b2ba039775bbf970a58e4a0a61b248953d30b');