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

时间:2017-11-16 05:30:12

标签: node.js amazon-web-services encryption amazon-s3 aes

我尝试解密来自s3的文件,该文件是由带有AES对称密钥加密的redshift上的unload命令上传的。 如果我们使用AWS java sdk使用给予s3客户端的aes密钥下载它可以正常工作。但是如果我们在下载文件后尝试手动解密它会导致javax.crypto.BadPaddingException: Given final block not properly padded错误。

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

我试过的Node.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

1 个答案:

答案 0 :(得分:0)

因此,Redshift使用信封加密的方式与AWS开发工具包使用信封加密的方式一样,将文件存储在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值=> var decipher = crypto.createDecipheriv('AES-128-ECB',key,'') ;

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

  4. 删除填充(如果Node.js Crypo, what's the default padding for AES?是正确的,则应该能够使用cipher.setAutoPadding(true))

我尚未在nodejs中对其进行编码,但是我已经在Python中成功使用了这些步骤 step2 step 3+4