解密 aws kms 密钥时出现 Nodejs 异步问题
Nodejs async issue while decrypting aws kms keys
我在 node6 中有一个 lambda 函数,它有 5 个环境变量,全部用 aws kms 加密。我有以下方法,它采用加密密钥和 returns 解密密钥。
function decryptKMS(encryptedKey) {
console.log('inside decryptkms');
const kms = new AWS.KMS();
kms.decrypt({ CiphertextBlob: new Buffer(encryptedKey, 'base64') }, (err, data) => {
if (err) {
console.log('Decrypt error:', err);
return callback(err);
}
var result = data.Plaintext.toString('ascii');
return result;
});
}
在我的处理程序中,我这样做是为了获取我的解密密钥。
decryptedkey1 = decryptKMS(encryptedkey1);
decryptedkey2 = decryptKMS(encryptedkey2);
decryptedkey3 = decryptKMS(encryptedkey3);
decryptedkey4 = decryptKMS(encryptedkey4);
decryptedkey5 = decryptKMS(encryptedkey5);
但是,由于节点是异步的,因此函数在解密密钥之前移至下一步。无论如何我可以对所有组合的密钥使用节点承诺,或者有什么方法可以从 kms 一次解密多个密钥?
承诺您的 decryptKMS
并与 Promise.all
结合
function decryptKMS(key) {
return new Promise((resolve, reject) => {
const kms = new AWS.KMS()
kms.decrypt({}, (err, data) => {
if(err) {
reject(err)
}
else {
resolve(data.Plaintext.toString('ascii'))
}
})
})
}
const keys = [encryptedkey1, encryptedkey2, encryptedkey3]
Promise.all(keys.map(decryptKMS))
.then(([decryptedkey1, decryptedkey2, decryptedkey3]) => {
// use decryptedkeyN here
})
.catch(console.log)
我在 node6 中有一个 lambda 函数,它有 5 个环境变量,全部用 aws kms 加密。我有以下方法,它采用加密密钥和 returns 解密密钥。
function decryptKMS(encryptedKey) {
console.log('inside decryptkms');
const kms = new AWS.KMS();
kms.decrypt({ CiphertextBlob: new Buffer(encryptedKey, 'base64') }, (err, data) => {
if (err) {
console.log('Decrypt error:', err);
return callback(err);
}
var result = data.Plaintext.toString('ascii');
return result;
});
}
在我的处理程序中,我这样做是为了获取我的解密密钥。
decryptedkey1 = decryptKMS(encryptedkey1);
decryptedkey2 = decryptKMS(encryptedkey2);
decryptedkey3 = decryptKMS(encryptedkey3);
decryptedkey4 = decryptKMS(encryptedkey4);
decryptedkey5 = decryptKMS(encryptedkey5);
但是,由于节点是异步的,因此函数在解密密钥之前移至下一步。无论如何我可以对所有组合的密钥使用节点承诺,或者有什么方法可以从 kms 一次解密多个密钥?
承诺您的 decryptKMS
并与 Promise.all
function decryptKMS(key) {
return new Promise((resolve, reject) => {
const kms = new AWS.KMS()
kms.decrypt({}, (err, data) => {
if(err) {
reject(err)
}
else {
resolve(data.Plaintext.toString('ascii'))
}
})
})
}
const keys = [encryptedkey1, encryptedkey2, encryptedkey3]
Promise.all(keys.map(decryptKMS))
.then(([decryptedkey1, decryptedkey2, decryptedkey3]) => {
// use decryptedkeyN here
})
.catch(console.log)