我正在使用@aws-sdk/client-kms
来加密数据。我得到了base64字符串作为响应。现在我得到了Uint8Array
。
const encryptedBlob = await kms.encrypt({
KeyId: kmsKey,
Plaintext: Buffer.from(JSON.stringify('data to encrypt')),
});
加密的明文。使用HTTP API或AWS CLI时,该值为Base64-encoded。否则,它不是Base64编码的。AWS文档中提到
有没有任何方法可以在nodeJ中获得base64作为响应。
如AWS SDK v3 docs docs中所述-只有HTTP API和CLI才能获得base64数据。其他介质将得到Uint8Array
作为响应。
因此,我们需要一些额外的数据转换来使用SDK实现加密和解密。
const { KMSClient, EncryptCommand, DecryptCommand } = require('@aws-sdk/client-kms');
const client = new KMSClient({ region: AWS_REGION });
// Encrypt
// Convert Uint8Array data to base64
const input = {
KeyId: kmsKey,
Plaintext: Buffer.from(JSON.stringify(credentials)),
};
const command = new EncryptCommand(input);
const encryptedBlob = await client.send(command);
const buff = Buffer.from(encryptedBlob.CiphertextBlob);
const encryptedBase64data = buff.toString('base64');
// Decrypt
// Convert Base64 data to Uint8Array
// Uint8Array(response) convert to string.
const command = new DecryptCommand({
CiphertextBlob: Uint8Array.from(atob(item.credentials), (v) => v.charCodeAt(0)),
});
const decryptedBinaryData = await client.send(command);
const decryptedData = String.fromCharCode.apply(null, new Uint16Array(decryptedBinaryData.Plaintext));