Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用带有对称密钥加密的unload命令解密卸载的s3文件_Node.js_Amazon Web Services_Encryption_Amazon S3_Aes - Fatal编程技术网

Node.js 使用带有对称密钥加密的unload命令解密卸载的s3文件

Node.js 使用带有对称密钥加密的unload命令解密卸载的s3文件,node.js,amazon-web-services,encryption,amazon-s3,aes,Node.js,Amazon Web Services,Encryption,Amazon S3,Aes,我尝试从s3解密一个文件,该文件是通过使用AES对称密钥加密的redshift的unload命令上传的。 如果我们使用AWS java sdk下载,并将aes密钥提供给s3客户端,则可以正常工作。但如果我们在下载文件后尝试手动解密,则会出现javax.crypto.BadPaddingException:给定的最终块未正确填充错误 手动解密文件的原因是我想使用node.js对文件进行解密,据我所知,node中没有sdk可以直接进行解密 我尝试过的Node.js代码: var AWS = requ

我尝试从s3解密一个文件,该文件是通过使用AES对称密钥加密的redshift的unload命令上传的。 如果我们使用AWS java sdk下载,并将aes密钥提供给s3客户端,则可以正常工作。但如果我们在下载文件后尝试手动解密,则会出现
javax.crypto.BadPaddingException:给定的最终块未正确填充
错误

手动解密文件的原因是我想使用node.js对文件进行解密,据我所知,node中没有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);

当我尝试此操作时,会出现以下错误:
错误:错误:06065064:数字信封例程:EVP_DecryptFinal_ex:bad decrypt

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

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

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

  • 删除填充(如果正确,应能够使用cipher.setAutoPadding(true))
  • 我没有在nodejs中进行编码,但我已经在Python中成功地使用了这些步骤
    因此,Redshift使用信封加密的方式与AWS SDK使用信封加密在S3上存储文件的方式相同。因此,为了解密文件,您应该:

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

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

  • 删除填充(如果正确,应能够使用cipher.setAutoPadding(true))
  • 我没有在nodejs中进行编码,但我已经在Python中成功地使用了这些步骤