【发布时间】:2012-08-25 02:22:36
【问题描述】:
当我尝试加密的文本包含重音字符(例如ä、ï、ë)时,我在 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 编码中有效,所以我不知道为什么加密对它们有问题。可能是我需要以某种方式告诉 crypto 我正在签署 utf8 编码的文本,但我不知道该怎么做。
这篇文章描述了完全相同的问题:NodeJS hmac digest issue with accents 但是,帖子本身以及答案对我来说没有意义(因为他们将要加密的数据传递到密钥应该去的地方)。
这里是 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
谢谢
【问题讨论】:
-
随后发现,当我在 Macbook 上运行完全相同的脚本时,上面的测试返回了一个匹配的“预期”值 - 之前一直在 Windows 上运行
标签: node.js utf-8 hmac non-ascii-characters node-crypto