使用具有对称密钥加密的卸载命令解密卸载的 s3 文件



我尝试从 s3 解密一个文件,该文件是通过使用 AES 对称密钥加密从 redshift 卸载命令上传的。如果我们使用 AWS java sdk 下载,并使用提供给 s3 客户端的 aes 密钥,它可以正常工作。但是,如果我们尝试在下载文件后手动解密它,它会javax.crypto.BadPaddingException: Given final block not properly padded错误。

手动解密文件的原因是我想使用 node 解密文件.js据我所知,节点中没有可以直接执行此操作的 sdk。

我尝试过的节点.js代码:

var AWS = require('aws-sdk');
var fs = require('fs');
var crypto = require('crypto');
var CryptoJS = require("crypto-js");
var algorithm = 'aes256';
var inputEncoding = 'hex';
var outputEncoding = 'utf-8';
var key = "symmetric key base 64"; //prod
var data = fs.readFileSync('/tmp/files/myfile');
console.log(data);
var decipher = crypto.createDecipher(algorithm,key);
var deciphered = decipher.update(data, inputEncoding, outputEncoding);
console.log(deciphered);
deciphered += decipher.final(outputEncoding); 
console.log(deciphered);

当我尝试此操作时,我收到此错误:Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

因此,Redshift 使用信封加密的方式

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

  1. 从 S3 对象元数据中获取加密的数据密钥和 iv(分别为 x-amz-meta-x-amz-key 和 x-amz-meta-x-amz-iv(
  2. 使用
  3. AES256 ECB 模式使用对称密钥解密该 x-amz-meta-x-amz-key 值 => var decipher = crypto.createDecipheriv('AES-128-ECB',key,''(;

  4. 然后使用 AES256 CBC 模式解密"0000_part_00",将步骤 1 中的 iv 设置为 iv,并将密钥设置为步骤 2 的结果。 => crypto.createDecipheriv('aes-128-cbc', key, iv(

  5. 删除填充(应该能够使用cipher.setAutoPadding(true(,如果Node.js Crypo,AES的默认填充是什么?是正确的(

我没有用nodejs编写它,但我已经在Python中成功地使用了这些步骤步骤2 步骤3+4

最新更新