Python加密模块可解密s3中的客户端加密数据

我有一个场景,其中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),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)

我认为这是解密数据的正确途径,但函数调用中的参数有误。请指教。

henshui22 回答:Python加密模块可解密s3中的客户端加密数据

好像我不得不在创建第一个密文对象时使用ECB()模式解密x-amz-key

org.apache.kafka.connect.data.Date

这解决了问题

本文链接:https://www.f2er.com/3054162.html

大家都在问