我无法解密从S3存储桶收到的消息。它们用KMS密钥加密。我使用Node和Typescript。
我已经尝试了一些东西,但并不能使它工作。查看此链接:https://github.com/gilt/node-s3-encryption-client/issues/3和https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SES.html
我的代码现在是这样的:
import * as AWS from 'aws-sdk';
import * as crypto from 'crypto';
const s3 = new AWS.S3({ apiVersion: '2006-03-01', region: 'eu-west-1' });
const kms = new AWS.KMS({ apiVersion: '2014-11-01', region: 'eu-west-1' });
export const handler = LambdaUtils.lambdaHandler( 'onebox-email-service-SendMailToL4PFunction', async (event) => {
const record = event.Records[0];
const request = {
Bucket: record.s3.bucket.name,
Key: record.s3.object.key
};
const data = await s3.getObject(request).promise();
const decryptData = await decryptSES(data);
return decryptData;
}
);
export const decryptSES = async (objectData) => {
const metadata = objectData.Metadata || {};
const kmsKeyBase64 = metadata['x-amz-key-v2'];
const iv = metadata['x-amz-iv'];
const tagLen = (metadata['x-amz-tag-len'] || 0) / 8;
let algo = metadata['x-amz-cek-alg'];
const encryptionContext = JSON.parse(metadata['x-amz-matdesc']);
switch (algo) {
case 'AES/GCM/NoPadding':
algo = 'aes-256-gcm';
break;
case 'AES/CBC/PKCS5Padding':
algo = 'aes-256-cbc';
break;
default:
log.error({Message: 'Unsupported algorithm: ' + algo});
return;
}
if (typeof (kmsKeyBase64) === 'undefined') {
log.error('Error');
}
const kmsKeyBuffer = new Buffer(kmsKeyBase64, 'base64');
const returnValue = await kms.decrypt({ CiphertextBlob: kmsKeyBuffer, EncryptionContext: encryptionContext }, (err, kmsData) => {
if (err) {
log.error({err});
return null;
} else {
const data = objectData.Body.slice(0, -tagLen);
const decipher = crypto.createDecipheriv( algo, kmsKeys.Plaintext[0], new Buffer(iv, 'base64'));
if (tagLen !== 0) {
const tag = objectData.Body.slice(-tagLen);
decipher.setAuthTag(tag);
}
let dec = decipher.update(data, 'binary', 'utf8');
dec += decipher.final('utf8');
return dec;
}
}).promise();
return returnValue;
};
我得到错误在我的lambda看起来像这样:
2019-02-05T17:06:19.015Z d9593ef7-635b-47b2-b881-ede2a396f88e错误:在Response.l.decrypt(/var/任务/<--plhd)时,新的分词器(crypto.js:267: 16)的密钥长度无效bject.create分词器(crypto.js:627: 10)/var/runtime/node_modules/AWS-sdk/lib/request.js:364: 18)在Request.call监听器(/var/runtime/node_modules/AWS-sdk/lib/sequential_executor.js:105: 20)在Request.emit(/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77: 10)在Request.emit(/var/runtime/node_modules/AWS-sdk/lib/request.js:683: 14)在Request.transition(/var/runtime/node_modules/AWS-sdk/lib/request.js:22: 10)在接受器状态achine.run到(/var/runtime/node_modules/AWS-sdk/lib/state_machine.js:14: 12)在 /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26: 10在请求。(/var/runtime/node_modules/AWS-sdk/lib/request.js:38: 9)在请求。(/var/runtime/node_modules/aws-sdk/lib/request.js:685: 12)在Request.call监听器(/var/runtime/node_modules/aws-sdk/lib/sequential_executor. js: 115:18)在请求. emit(/var/runtime/node_modules/aws-sdk/lib/sequential_executor. js: 77:10)在请求. emit(/var/runtime/node_modules/aws-sdk/lib/请求. js: 683:14)在请求.转换(/var/runtime/node_modules/aws-sdk/lib/请求. js: 22:10)
我可以在我的日志中看到我从我的s3桶中得到加密的消息,但是这样就不可能解密它。
有人能帮我吗?我使用节点和打字稿。
我从同事那里得到了一些帮助,我们可以解决这个问题。问题出在
常量破译=crypto.create破译(algo, kmsKeys.纯文本[0],新缓冲区(iv,'bas64'));
我们需要更改kms。纯文本
到kms。纯文本作为缓冲区
,它开始工作。如果有人以后需要,我会把我的洞放在这里。
import * as AWS from 'aws-sdk';
import * as crypto from 'crypto';
const kms = new AWS.KMS({ apiVersion: '2014-11-01', region: 'eu-west-1' });
export const decryptS3Message = async (objectData) => {
const metadata = objectData.Metadata || {};
const kmsKeyBase64 = metadata['x-amz-key-v2'];
const iv = metadata['x-amz-iv'];
const tagLen = (metadata['x-amz-tag-len'] || 0) / 8;
let algo = metadata['x-amz-cek-alg'];
const encryptionContext = JSON.parse(metadata['x-amz-matdesc']);
switch (algo) {
case 'AES/GCM/NoPadding':
algo = `aes-256-gcm`;
break;
case 'AES/CBC/PKCS5Padding':
algo = `aes-256-cbc`;
break;
default:
throw new ErrorUtils.NotFoundError('Unsupported algorithm: ' + algo);
}
if (typeof (kmsKeyBase64) === 'undefined') {
return null;
}
const kmsKeyBuffer = Buffer.from(kmsKeyBase64, 'base64');
const returnValue = await kms.decrypt({ CiphertextBlob: kmsKeyBuffer, EncryptionContext: encryptionContext }).promise()
.then((res) => {
const data = objectData.Body.slice(0, -tagLen);
const decipher = crypto.createDecipheriv( algo, res.Plaintext as Buffer, Buffer.from(iv, 'base64'));
if (tagLen !== 0) {
const tag = objectData.Body.slice(-tagLen);
decipher.setAuthTag(tag);
}
let dec = decipher.update(data, 'binary', 'utf8');
dec += decipher.final('utf8');
return dec;
}).catch((err) => {
throw new ErrorUtils.InternalServerError('Not able to decrypt message: ', err);
});
return returnValue;
};
decrypt方法中没有提供KMS密钥。这是否意味着KMS密钥在cyphertext Blob中被加密了?如果是... 如何授予解密加密密文Blob的权限? 如果要解密AWS服务中的值,是否创建IAM角色来执行此操作,并配置KMS密钥以允许该角色进行解密?
我无法解决问题,而且文件也没有什么帮助。 我有一个lambda需要使用KMS解密一个值。我正在使用sam部署我的lambda。最初我尝试添加策略声明
场景:我们的一个脚本使用boto3 kms api使用kms加密和解密来放置和获取SSM参数。SSM param put工作非常好,并且在EC2 SSM param存储中使用安全字符串添加参数(解密为true)。我们所面临的问题是当解密为真时尝试获取SSM参数值。运行此脚本的相应lambda代码在尝试运行以下boto3脚本时(在运行get_ssm_parameters_by_path时)抛出以下错
我正在尝试使用AmazonS3服务器端加密(KMS)多部分上传一个文件。我有点困惑,我的代码中是否需要KMS键,如果需要,那么我如何将它添加到Java代码中呢? --更新私有静态void saveMultipartData(String clientRegion,String bucketName,String awsFilePath,File File){AmazonS3 s3client=Am
一对亚马逊lambda会对称地加密和解密一小块应用数据。我想用亚马逊KMS来方便这一点,因为它解决了秘密存储和密钥旋转的问题,然后一些。 Amazon KMS开发人员指南指出: 这些操作是为了加密和解密数据密钥而设计的。他们在加密操作中使用AWS KMS客户主密钥(CMK),并且不能接受超过4 KB(4096字节)的数据。虽然您可以使用它们来加密少量数据(如密码或RSA密钥),但它们并不是为加密应
问题内容: 因此,我一直在尝试使用带有node-rsa的node和带有jsencrypt的 javascript 创建一个网站(用于分配),其中javascript客户端获取服务器生成的公共密钥(node- rsa),对消息进行加密(jsencrypt)用户输入的密码,将其发送到服务器,并让服务器对其进行解密(node- rsa)。密钥的生成有效,而加密有效,但是解密无效。启动节点脚本时,请执行以