NodeJS aes gcm无效套件类型错误

时间:2018-08-06 14:18:40

标签: node.js openssl cryptography aes-gcm libressl

我正在尝试使用来自节点的默认密码包,并使用aes-256-gcm模式加密一些数据。

代码如下:

var crypto = require('crypto');

function encrypt() {
   var sessionKey = Buffer.from(crypto.randomBytes(32));
   const iv = crypto.randomBytes(16);
   const key = crypto.pbkdf2Sync(sessionKey, salt, 1000, 32, 'sha512');
   const cipher = crypto.createCipherIv('aes-256-gcm', key, iv);
    ......
}

如上所述,尝试初始化密码时出现错误。错误是:

encrypter.js:77 Uncaught TypeError: invalid suite type
    at Object.createCipheriv (encrypter.js:77)

我将密码更改为aes-256-cbc进行测试,效果很好。因此,我感觉由于计算机上的OpenSSL,GCM模式可能无法正常工作。我做了检查,似乎还可以。我尝试使用id-aes256-GCM名称,但仍然遇到相同的错误。

我的环境如下:

node -v:   v10.8.0

openssl version : LibreSSL 2.2.7

我尝试使用以下命令查找可用的密码

  

openssl list-cipher-algorithms

该列表包含:id-aes128-GCM, id-aes192-GCM, id-aes256-GCM

我还检查了openssl enc --help,它列出了带有不同名称的gcm命令:

Valid ciphername values:
-aes-128-gcm
-aes-192-gcm
-aes-256-gcm

PS:我不确定这些不同的值是否意味着不同。

Node有点新,所以如果您能指出问题所在的话,那将是很棒的事情。

编辑:在JS控制台失败的那一行查看。密码如下:

var modelist = {
  ECB: require('./modes/ecb'),
  CBC: require('./modes/cbc'),
  CFB: require('./modes/cfb'),
  OFB: require('./modes/ofb'),
  CTR: require('./modes/ctr')
};
module.exports = function (crypto) {
  function createCipheriv(suite, password, iv) {
    var config = modes[suite];
    if (!config) {
      throw new TypeError('invalid suite type');
    }

所以我猜这些配置不支持GCM或不加载GCM吗?

1 个答案:

答案 0 :(得分:1)

正如我在上面的评论中提到的。当Webpack构建单个package.js文件时,我试图使用React App中的'crypto'软件包,并且它不包含在最终的软件包文件中。因此,为了解决这一问题,我必须安装cryptobit的browserify版本

npm install crypto-browserify --save

并分别导入密码功能。

const mycrypto = require('crypto')
var aes = require('browserify-aes')

有效的最终代码(仅更改)是:

const iv = mycrypto.randomBytes(16);
const key = mycrypto.pbkdf2Sync(sessionKey, salt, 1000, 32, 'sha512');
const cipher = aes.createCipherIv('aes-256-gcm', key, iv);

哈希和randombytes等功能仍将在加密软件包中使用。只有密码功能来自浏览器化的软件包。

感谢@Maarten对iv大小和authTag选项的建议。