解密 Amazon Redshift CSV 转储

Posted

技术标签:

【中文标题】解密 Amazon Redshift CSV 转储【英文标题】:Decrypt Amazon Redshift CSV dump 【发布时间】:2015-06-10 15:36:35 【问题描述】:

我想在本地解密 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

如何?

【问题讨论】:

【参考方案1】:

密钥作为元数据存储在x-amz-meta-x-amz-key 中,IV 作为元数据存储在x-amz-meta-x-amz-iv 中。来自Redshift documentation:

... 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

【讨论】:

【参考方案2】:

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

    从 S3 对象元数据中获取加密的数据密钥和 iv(分别为 x-amz-meta-x-amz-key 和 x-amz-meta-x-amz-iv) 使用 AES256 ECB 模式使用对称密钥解密 x-amz-meta-x-amz-key 值 然后使用 AES256 CBC 模式解密“0000_part_00”,将步骤 1 中的 iv 设置为 iv,并将密钥设置为步骤 2 的结果。 删除填充。

如果您发现这些步骤很麻烦,您可以将 MANIFEST 添加到您的 UNLOAD 中,这将添加一个清单文件。然后你可以使用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/ 中。

【讨论】:

以上是关于解密 Amazon Redshift CSV 转储的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 SQL Workbench 将 Amazon Redshift 输出保存到本地 CSV?

从 Amazon Redshift UNLOAD 创建对 RFC-4180 友好的 CSV 文件的最佳方法是啥?

将 Alexa 数据导入 Amazon RedShift

将带逗号的双引号作为分隔符从 S3 导入 Amazon Redshift

Amazon Redshift - 卸载到 S3 - 动态 S3 文件名

Amazon EMR 与 Amazon Redshift