我正在尝试使用来自节点的默认密码包,并使用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吗?
答案 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选项的建议。