【问题标题】:How to use id-aes256-GCM with Node.JS crypto? "TypeError: DecipherFinal fail"如何将 id-aes256-GCM 与 Node.JS 加密一起使用? “TypeError:DecipherFinal 失败”
【发布时间】: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


【解决方案1】:

OpenSSL 中的 GCM 模式可以正常工作。它也已经通过其他实现进行了测试。我知道PolarSSL SSL library 有自己的 AES GCM 实现,PolarSSL 可以与 OpenSSL 一起正常工作。

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

(StevenLoomen 在 cmets 中也指出了原因,但我想给大家一个答案)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多