1

我有一个场景,其中 s3 内的数据使用对称密钥进行客户端加密,我想解密来自 Lambda 的数据。

我对客户端加密的理解是 s3 使用内容加密密钥 (cek) 来加密数据并将这个 cek 以加密形式添加到 iv 到 s3 文件元数据中。在我的例子中,由 Odin 维护的客户密钥促进了这种 cek 加密。解密计划是从相应的文件元数据中解密 cek,然后用它来解密文件的实际内容。

这是关于相同的 aws s3 文档 - https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/package-summary.html

为此,我正在使用 python 加密模块,我正在读取 s3 元数据以获取 x-amz-key(cek) 和 x-amz-iv,对它们进行解码(使用 base64.b64decode)并使用密码解密器来解密 x- amz-key 密钥,然后我使用解密密钥来解密实际正文。但是,当我这样做时,我的 lambda 会运行,但只提供我无法使用的垃圾数据。

代码片段 -

sym_key = 'ksjbfkjawdhgiua#151' #this is just a made-up symmetric key
print ('sym key ', type(sym_key), sym_key)
bucket_name = '<s3-bucket-name>'
prefix = '<encryted_file_key>'
s3_email = s3.Object(bucket_name, prefix)
meta = s3_email.get()['Metadata']
print ('meta ', type(meta), meta)
encrypted_data = s3_email.get()['Body'].read()
env_key = base64.b64decode(meta['x-amz-key'])
env_iv = base64.b64decode(meta['x-amz-iv'])
print ("Decrypting symmetric key..")
cipher = Cipher(algorithms.AES(sym_key), modes.CBC(env_iv), backend=default_backend())
decryptor = cipher.decryptor()
decrypt_key = decryptor.update(env_key) + decryptor.finalize()
#using below subsetting the decrypt_key to keep AES key to 256 length
decrypt_key = decrypt_key[len(env_iv):]
print ('decrypt_key ', type(decrypt_key), decrypt_key)
#start data decryption
data_cipher = Cipher(algorithms.AES(decrypt_key), modes.CBC(env_iv), default_backend())
data_decryptor = data_cipher.decryptor()
decrypt_txt = data_decryptor.update(encrypted_data) + data_decryptor.finalize()
#prints gives some garbage characters
print ('decrypt_txt ', type(decrypt_txt), decrypt_txt)

我相信这是解密数据的正确途径,但函数调用中的参数出错了。请指教。

4

1 回答 1

1

看起来我必须在创建第一个 ciphercontext 对象时使用 ECB() 模式来解密 x-amz-key

cipher = Cipher(algorithms.AES(sym_key), modes.ECB(), backend=default_backend())

这解决了问题

于 2019-12-03T17:50:21.013 回答