【发布时间】:2012-06-30 20:27:11
【问题描述】:
我想使用经过身份验证的加密方案(如 AES-GCM)加密 Node.js 中的一些数据。
如果我运行以下示例代码
app.get("/test", function(req,res) {
var key = "12345678901234567890123456789012";
var iv = "123456789012";
var cipher = crypto.createCipheriv("id-aes256-GCM",key.toString("binary"),iv.toString("binary"));
var decipher = crypto.createDecipheriv("id-aes256-GCM",key.toString("binary"),iv.toString("binary"));
console.log(decipher.update(cipher.update("bla")));
console.log(decipher.update(cipher.final()));
console.log(decipher.final());
});
我没有得到控制台输出,但出现错误消息“TypeError:DecipherFinal 失败”。 如果我使用密码 AES-256-CTR 而不是“id-aes256-GCM”,则此代码可以正常工作并在控制台上打印“bla”。
我做错了什么?
编辑:
进一步调查显示,cipher.update("bla") 返回“â”(单个字符...奇怪),而 cipher.final() 返回一个空字符串。我认为这不可能是正确的密文,至少应该有明文的大小......
【问题讨论】:
-
cipher.update("bla")和cipher.final()返回的密文大小是多少? -
我编辑了这个问题来回答它
-
抱歉造成误解 - 我的意思是我通过编辑回答了您的问题。不幸的是,我在接下来的 3 周内无法使用 id-aes256-GCM 加密方案的电脑,所以我会测试你的建议 cipher.update("bla","binary","hex") 。
-
据我所知,这是 OpenSSL 的问题。发出
echo -n "bla" | openssl enc -e -id-aes256-GCM -nosalt -a -out t.out后跟openssl enc -d -id-aes256-GCM -nosalt -a -in t.out会产生错误bad decrypt。可能是 OpenSSL 中的错误? -
GCM 需要额外的参数,NodeJS 可能无法提供给 OpenSSL。看到这个线程/链接:mail-archive.com/openssl-users@openssl.org/msg68932.html
标签: javascript security node.js cryptography express