В настоящее время я занимаюсь разработкой частного облачного хранилища с использованием 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, я тоже могу это предоставить. Я также проверил загрузку / скачивание БЕЗ шифрования, и оно отлично работает без лишних данных.