Node.js шифрует большой файл, используя AES
Я пытаюсь использовать следующий код для шифрования файла размером 1 ГБ. Но Node.js прерывается с "FATAL ERROR: JS Allocation не удалось - процесс не хватает памяти". Как я могу справиться с этим?
var fs = require('fs');
var crypto = require('crypto');
var key = "14189dc35ae35e75ff31d7502e245cd9bc7803838fbfd5c773cdcd79b8a28bbd";
var cipher = crypto.createCipher('aes-256-cbc', key);
var file_cipher = "";
var f = fs.ReadStream("test.txt");
f.on('data', function(d) {
file_cipher = file_cipher + cipher.update(d, 'utf8', 'hex');
});
f.on('end', function() {
file_cipher = file_cipher + cipher.final('hex');
});
1 ответ
Решение
Вы можете записать зашифрованный файл обратно на диск вместо буферизации всей вещи в памяти:
var fs = require('fs');
var crypto = require('crypto');
var key = '14189dc35ae35e75ff31d7502e245cd9bc7803838fbfd5c773cdcd79b8a28bbd';
var cipher = crypto.createCipher('aes-256-cbc', key);
var input = fs.createReadStream('test.txt');
var output = fs.createWriteStream('test.txt.enc');
input.pipe(cipher).pipe(output);
output.on('finish', function() {
console.log('Encrypted file written to disk!');
});
crypto.createCipher() без вектора инициализации устарел, посколькуNodeJS v10.0.0
вместо этого используйте crypto.createCipheriv().
Вы также можете перенаправить потоки, используя stream.pipeline () вместоpipe
метод, а затем обещать его (чтобы код легко вписался в поток обещаний и async/await).
const {createReadStream, createWriteStream} = require('fs');
const {pipeline} = require('stream');
const {randomBytes, createCipheriv} = require('crypto');
const {promisify} = require('util');
const key = randomBytes(32); // ... replace with your key
const iv = randomBytes(16); // ... replace with your initialization vector
promisify(pipeline)(
createReadStream('./text.txt'),
createCipheriv('aes-256-cbc', key, iv),
createWriteStream('./text.txt.enc')
)
.then(() => {/* ... */})
.catch(err => {/* ... */});
Я бы просто использовал для этого Fileger. Это пакет на основе обещаний и чистая альтернатива файловой системе NodeJS.
const fileger = require("fileger")
const file = new fileger.File("./your-file-path.txt");
file.encrypt("your-password") // this will encrypt the file
.then(() => {
file.decrypt("your-password") // this will decrypt the file
})