Шифрование файлового потока + дешифрование Добавление случайных данных в NodeJS - PullRequest
0 голосов
/ 07 января 2020

В настоящее время я занимаюсь разработкой частного облачного хранилища с использованием AWS S3 для личного использования. Инфраструктура проста - загружать файлы с помощью моего API, API будет шифровать + загружать в Amazon S3. Вы также можете скачать его, где мой API выполняет роль промежуточного программного обеспечения для расшифровки файла и его потоковой передачи моему клиенту. Проблема в том, что при загрузке в файл добавляются случайные данные, но каждый раз они разные. Это какие-то метаданные? Позвольте мне показать вам, о чем я говорю:

file.txt

Spicy jalapeno bacon ipsum dolor amet fugiat fatback ut flank dolor in ea, aute buffalo duis. T-bone occaecat sunt nisi commodo pig. Beef ullamco prosciutto irure cow dolore. Reprehenderit chicken ut, pork chop venison consectetur quis in. Ut pig duis aliqua.

file.txt.une c после шифрования, выгрузки, загрузки, дешифрования

l5T
 ��ĕ�]�'Q�Spicy jalapeno bacon ipsum dolor amet fugiat fatback ut flank dolor in ea, aute buffalo duis. T-bone occaecat sunt nisi commodo pig. Beef ullamco prosciutto irure cow dolore. Reprehenderit chicken ut, pork chop venison consectetur quis in. Ut pig duis aliqua.

Я попытался кодировать файл base64 перед загрузкой, чтобы проверить, не произошла ли потеря данных, но он работает точно так же, как указано выше:

file.txt.base64

U3BpY3kgamFsYXBlbm8gYmFjb24gaXBzdW0gZG9sb3IgYW1ldCBmdWdpYXQgZmF0YmFjayB1dCBmbGFuayBkb2xvciBpbiBlYSwgYXV0ZSBidWZmYWxvIGR1aXMuIFQtYm9uZSBvY2NhZWNhdCBzdW50IG5pc2kgY29tbW9kbyBwaWcuIEJlZWYgdWxsYW1jbyBwcm9zY2l1dHRvIGlydXJlIGNvdyBkb2xvcmUuIFJlcHJlaGVuZGVyaXQgY2hpY2tlbiB1dCwgcG9yayBjaG9wIHZlbmlzb24gY29uc2VjdGV0dXIgcXVpcyBpbi4gVXQgcGlnIGR1aXMgYWxpcXVhLgo=

file.txt.base64.une c

���|ȱ�����j�bU3BpY3kgamFsYXBlbm8gYmFjb24gaXBzdW0gZG9sb3IgYW1ldCBmdWdpYXQgZmF0YmFjayB1dCBmbGFuayBkb2xvciBpbiBlYSwgYXV0ZSBidWZmYWxvIGR1aXMuIFQtYm9uZSBvY2NhZWNhdCBzdW50IG5pc2kgY29tbW9kbyBwaWcuIEJlZWYgdWxsYW1jbyBwcm9zY2l1dHRvIGlydXJlIGNvdyBkb2xvcmUuIFJlcHJlaGVuZGVyaXQgY2hpY2tlbiB1dCwgcG9yayBjaG9wIHZlbmlzb24gY29uc2VjdGV0dXIgcXVpcyBpbi4gVXQgcGlnIGR1aXMgYWxpcXVhLgo=

Как вы можете видеть, строка base 64 все еще сохраняется, просто содержит некоторые вводные данные. Вот мои логи шифрования / дешифрования c:

encrypt. js

const crypto = require('crypto');
const fs = require('fs');
const path = require('path');
const zlib = require('zlib');

const AppendInitVect = require('./appendInitVect');
const getCipherKey = require('./getCipherKey');

function encrypt({ file, secret }) {
  return new Promise((resolve,reject) => {
    const initVect = crypto.randomBytes(16);
    const CIPHER_KEY = getCipherKey(secret);
    const readStream = fs.createReadStream(file);
    readStream.on('data',console.log)
    const cipher = crypto.createCipheriv('aes256', CIPHER_KEY, initVect);
    const appendInitVect = new AppendInitVect(initVect);
    const writeStream = fs.createWriteStream(path.join(file + ".enc"));
    var stream = readStream
      .pipe(cipher)
      .pipe(appendInitVect)
      .pipe(writeStream);
    stream.on('finish', resolve);
  })

}

module.exports = encrypt;

расшифровка. js

const crypto = require('crypto');
const fs = require('fs');
const path = require('path');
const zlib = require('zlib');
const uuid = require('uuid/v1');
const getCipherKey = require('./getCipherKey');


function decrypt({stream,res,secret}) {
  const initVect = crypto.randomBytes(16);
  const CIPHER_KEY = getCipherKey(secret);
  const decipher = crypto.createDecipheriv('aes256', CIPHER_KEY, initVect);
  var id = uuid();
  const writeStream = fs.createWriteStream(id+'.unenc');
  return stream.pipe(decipher).pipe(writeStream);
}



module.exports = decrypt;

appendInitVect. js

const { Transform } = require('stream');

class AppendInitVect extends Transform {
  constructor(initVect, opts) {
    super(opts);
    this.initVect = initVect;
    this.appended = false;
  }

  _transform(chunk, encoding, cb) {
    if (!this.appended) {
      this.push(this.initVect);
      this.appended = true;
    }
    this.push(chunk);
    cb();
  }
}

module.exports = AppendInitVect;

getCipherKey. js

const crypto = require('crypto');

module.exports = function (secret) {
  return crypto.createHash('sha256').update(secret).digest();
}

Есть ли что-то сумасшедшее, что я здесь не так делаю? Если здесь требуется загрузка / загрузка на S3, я тоже могу это предоставить. Я также проверил загрузку / скачивание БЕЗ шифрования, и оно отлично работает без лишних данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...