我遇到了一个泡菜,用户有一个public
和private
密钥对,它们是使用node.js v11.11.0中的crypto
生成的。
private
键受密码保护。我分发了public
,并用它来加密用于AES加密(混合模式)的密钥。
可以从命令行(在Linux上为openssl)使用私钥就可以了。但是使用node.js时,我得到了错误bad decrypt
和EVP DecryptFinal
。
该对是这样生成的:
crypto.generateKeyPair('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: rand_pass
}
}, (err, pub, priv) => {
if (err) {
console.dir(err);
return callback({ status: 500,
success: false,
message: err });
}
else {
let key_file = crypto.createHash('sha256').update(id).digest('hex');
let dir = global.keys;
let pub_file = dir + key_file + '.pub';
let prv_file = dir + key_file + '.priv';
fs.writeFileSync(pub_file, pub);
fs.writeFileSync(prv_file, priv);
models.User.activate(id, pub_file, prv_file, function(reply) {
return res.status(201).json(reply);
});
}
});
当我读取私钥时,我得到:
-----BEGIN ENCRYPTED PRIVATE KEY-----
从命令行中(并提供密码),我得到:
RSA key ok
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
但是,从node.js加载private
键变成了一个问题。使用方法crypto.createPrivateKey(key)
,我无法加载私钥:
var meta = query.meta;
var key_pem = fs.readFileSync(query.private_key, "ascii");
if (key_pem === undefined) {
return res.status(500).json({message: "internal error" });
}
var priv_key = crypto.createPrivateKey(key_pem, 'pem', 'pkcs8', rand_pass);
即使我尝试了各种编码(键)变体并且参数都相同,错误始终是相同的。
有人在不使用child_process
而是仅使用本机方法的情况下成功地在Node.JS中成功使用了具有密码保护的私钥吗?