1

我正在尝试使用节点中的默认加密包并使用 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进行测试,效果很好。所以我觉得 GCM 模式可能因为我机器上的 OpenSSL 而无法工作。我做了检查,似乎很好。我尝试使用该id-aes256-GCM名称,但仍然得到相同的错误。

我的环境如下所示:

node -v:   v10.8.0

openssl version : LibreSSL 2.2.7

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

openssl 列表密码算法

该列表包含: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 不支持或不被这些配置的加密加载?

4

1 回答 1

1

正如我在上面的评论中提到的。当 webpack 构建单个 package.js 文件时,我试图使用来自 React 应用程序的“加密”包,并且它不包含在最终包文件中。所以为了解决这个问题,我必须安装 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);

散列和随机字节等函数仍将在加密包中使用。只有密码函数来自 browserified 包。

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

于 2018-08-08T10:11:24.847 回答