我尝试解密来自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
答案 0 :(得分:0)
因此,Redshift使用信封加密的方式与AWS开发工具包使用信封加密的方式一样,将文件存储在S3上。因此,为了解密文件,您应该:
使用AES256 ECB模式使用对称密钥解密该x-amz-meta-x-amz-key值=> var decipher = crypto.createDecipheriv('AES-128-ECB',key,'') ;
然后使用AES256 CBC模式解密'0000_part_00',将iv从步骤1设置为iv,并将密钥设置为步骤2的结果。=> crypto.createDecipheriv('aes-128-cbc',key,iv )