如何在Node.JS加密中使用id-aes256-GCM? “TypeError:DecipherFinal失败”

时间:2012-06-29 09:44:59

标签: javascript security node.js cryptography express

我想使用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 fail”。 如果我使用密码AES-256-CTR而不是“id-aes256-GCM”,这段代码工作正常并在控制台上打印“bla”。

我做错了什么?

修改

进一步调查显示,cipher.update(“bla”)返回“â”(单个字符......奇怪),cipher.final()返回一个空字符串。我认为这不应该是一个正确的密文,至少应该有明文的大小......

1 个答案:

答案 0 :(得分:6)

OpenSSL中的GCM模式运行正常。它已经与其他实现一起测试过。我知道PolarSSL SSL library有自己的AES的GCM实现,而PolarSSL可以与OpenSSL一起使用。

AES的GCM加密模式需要特定的GCM相关参数。当前的NodeJS API无法将这些值提供给OpenSSL。因此,调用失败,但没有干净的错误。 (这更像是一个OpenSSL问题,而不是NodeJS问题。)

(StevenLoomen也在评论中指出了原因,但我希望每个人都能找到答案)