#node.js #amazon-web-services #amazon-s3 #aws-kms #aws-sdk-nodejs
#node.js #amazon-веб-сервисы #amazon-s3 #amazon-kms #aws-sdk-nodejs
Вопрос:
Я использую @aws-crypto/client-node
модуль npm для шифрования расшифровки файла с помощью KMS
ключа. но когда я запускаю следующий код. Я получаю сообщение об ошибке «Отсутствуют учетные данные в конфигурации»
const {
KmsKeyringNode,
encrypt,
decrypt
} = require("@aws-crypto/client-node");
const encryptData = async (plainText, context) => {
try {
const {
result
} = await encrypt(keyring, plainText, {
encryptionContext: context
});
return resu<
} catch (e) {
console.log(e);
}
};
encryptData('hello world', {
stage: "test",
purpose: "poc",
origin: "us-east-1"
})
Ответ №1:
Я вижу пару проблем с этим кодом:
- Вы пытаетесь импортировать функции шифрования и дешифрования непосредственно из модуля. Это не так, как работает aws-crypto. Вам необходимо использовать build client для создания экземпляра, который будет содержать эти методы.
- Вы используете переменную keyring, но keyring никогда не объявляется? Вам необходимо создать связку ключей, используя метод .KmsKeyringNode.
Чтобы правильно использовать AWS / KMS для шифрования и дешифрования данных, ознакомьтесь с примером ниже. (Обратите внимание, что в этом примере не используется контекст для его простоты, а также дополнительные ключи, которые вы можете добавить. Также в этом примере предполагается, что вы также используете один и тот же ключ для шифрования и дешифрования)
const {
AMAZON_ENCRYPTION_KEY_ARN
} = process.env;
const awsCrypto = require('@aws-crypto/client-node');
const awsEncryptionClient = awsCrypto.buildClient(
awsCrypto.CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
);
const keyring = new awsCrypto.KmsKeyringNode({
generatorKeyId: AMAZON_ENCRYPTION_KEY_ARN
});
const encrypt = async (data) => {
try {
const { result } = await awsEncryptionClient.encrypt(keyring, data);
return result.toString('base64');
}
catch(err) {
console.log('Encryption error: ', err);
throw err;
}
};
const decrypt = async (encryptedData) => {
try {
const encryptedBuffer = Buffer.from(encryptedData, 'base64');
const { plaintext } = await awsEncryptionClient.decrypt(keyring, encryptedBuffer);
return plaintext.toString('utf8');
}
catch(err) {
console.log('Decryption error: ', err);
throw err;
}
};
module.exports = {
encrypt,
decrypt
};
Вы можете создать файл, используя приведенный выше код, и вызывать функции, импортируя этот файл в другое место. Вам нужно будет добавить ключ шифрования / дешифрования arn. Помимо шифрования и дешифрования, добавляется кодирование и декодирование в base64, поэтому конечный результат подходит для хранения (например, базы данных)
Дополнительные примеры кода смотрите здесь.