解密亚马逊Redshift CSV转储



我想在本地解密Amazon Redshift表的CSV转储。我使用unload命令和客户端加密,因为数据包含敏感信息。

我使用的命令是这样的:

unload ('select * from testtable.test')
to 's3://unload'
credentials 'aws_access_key_id=<AWS_KEY_ID>;aws_secret_access_key=<AWS_SECRET_KEY_ID>;master_symmetric_key=<MASTER_KEY>'
delimiter as ','
addquotes
escape
encrypted
ALLOWOVERWRITE
为了生成一个master_key,我使用了以下命令:
openssl enc -aes-256-cbc -pass pass:<mypass> -P -nosalt -base64
这个输出:

key=....
iv =....

我使用key作为' master_symmetric_key.

我将s3数据复制到本地,并尝试像这样解密:

openssl enc -aes-256-cbc -d -nosalt -base64 -in 0000_part_00 -out temps.csv

但得到:

bad decrypt 6038:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex: wrong
final block length:/SourceCache/OpenSSL098/OpenSSL098-52.20.2/src/crypto/evp/evp_enc.c:323

如何解密亚马逊Redshift CSV转储?

Key为元数据存储,在x-amz-meta-x-amz-key中可用,IV为元数据存储,在x-amz-meta-x-amz-iv中可用。来自Redshift文档:

…然后UNLOAD将加密的数据文件存储在Amazon S3中,并将加密的信封密钥和IV存储为每个文件的对象元数据。加密的信封密钥存储为对象元数据x-amz-meta-x-amz-key, IV存储为对象元数据x-amz-meta-x-amz-iv。

当您获得S3对象时,您还将获得这些元数据字段。下面是一些S3 GET-Object的例子:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html

所以Redshift使用信封加密的方式与AWS SDK使用信封加密在S3上存储文件的方式相同。因此,为了解密该文件,您应该:

  1. 从S3对象元数据(x-amz-meta-x-amz-key和x-amz-meta-x-amz-iv)中获取加密后的数据密钥和iv
  2. 使用AES256 ECB模式使用对称密钥解密x-amz-meta-x-amz-key值
  3. 然后使用AES256 CBC模式解密'0000_part_00', iv从step1设置为iv,密钥设置为step2的结果。
  4. 删除填充。

如果您发现这些步骤很麻烦,您可以做的是将MANIFEST添加到您的UNLOAD中,这将添加一个MANIFEST文件。然后你可以使用redshift-manifest-tools,它允许检索清单文件中提到的文件,并为你执行解密。

如下命令:

redshift-manifest-tools --action retrieve-files --manifest-s3url 's3://<your-bucket>/path/to.manifest' --dest /tmp/ --symmetric-key '<base64-master-key>'

将下载文件,解密并将明文版本存储在/tmp/中。

相关内容

最新更新