Зашифровать zip-папку при загрузке, а затем расшифровать с помощью Node.js? - PullRequest
0 голосов
/ 06 марта 2020

Итак, у меня есть приложение, которое загружает папку zip с кучей аудиофайлов в ней. Я хочу зашифровать этот zip-файл при загрузке, а затем иметь возможность расшифровать zip-файл в каком-то другом месте приложения, чтобы его можно было извлечь. У меня есть basi c logi c для шифрования и дешифрования с использованием пакета Node's Crypto и AES-256 с режимом CTR, но я не могу получить пригодный для использования zip-файл в конце процесса.

Вот мой запрос http.get, который я использую для загрузки zip-файла

http.get(fileURI).on('response', function(res) {
    res.on('data', function(chunk) {
        let encryptedChunk = encrypt(chunk);
        writeStream.write(encryptedChunk);
    }).on('end', function() {
        writeStream.end();
    })
})

Так что запрос get шифрует каждый кусок данных при его загрузке и отправляет его в writeStream, который открыт для указанного c файл, а затем запись заканчивается, когда загрузка zip завершена. Это похоже на правильное шифрование, в том смысле, что я не могу открыть zip-файл (Windows не может открыть всплывающее окно с ошибкой).

Моя функция шифрования очень базовая c, которая называется в запросе http выглядит так:

function encrypt(data) {
    try {
        let cipher = crypto.createCipher('aes-256-ctr', key); // key is a random string
        let encrypted = Buffer.concat([cipher.update(new Buffer(data, "utf8")), cipher.final()]);
        return encrypted;
    } catch (exception) {
        console.error(exception);
    }
}

У меня есть функция, которая создает readStream, которая пытается расшифровать этот файл, это выглядит так:

function decryptzip() {
    // assume there are a bunch of necessary filepaths up here

    let readStream = fs.createReadStream(downloadedZipFilePath);
    let writeStream = fs.createWriteStream(newDecryptedZipFilePath);
    readStream.on('data', (chunk) => {
        let decryptedChunk = decrypt(chunk);
        writeStream.write(decryptedChunk); // the goal of this write stream is to have a usable zip file once it closes
    }).on('finish', () => {
        writeStream.end();
    })
}

И тогда мой Фактическая функция дешифрования выглядит следующим образом:

function decrypt(data) {
    try {
        let decipher = crypto.createDecipher('aes-256-ctr', key); // same key used in encrypt
        let decrypted = Buffer.concat([decipher.update(data), decipher.final()]);
        return decrypted;
    } catch (exception) {
        console.error(exception);
    }
}

Обе эти функции шифрования и дешифрования работают с обычным текстом, но «расшифрованный» zip-файл все еще непригоден и дает мне сообщение «Windows не может открыть папку». ошибка ", когда я пытаюсь увидеть, что внутри. Я действительно понятия не имею, что я делаю с точки зрения этого материала, поэтому любая помощь будет оценена, я довольно потерян, смеется.

1 Ответ

0 голосов
/ 06 марта 2020

Крипто API-интерфейс Node все еще достаточно низкоуровневый, чтобы многое могло go ошибаться. Например, вы можете захотеть добавить HMA C к зашифрованным данным, чтобы обеспечить их целостность.

Мое предложение будет заключаться в использовании привязки Javascript libsodium или аналогичной, чтобы вы получили еще более высокую Уровень API. Родные привязки, которые я мог найти, не производили наиболее зрелого впечатления и не использовали устаревшие версии libsodium.

Поэтому я бы рекомендовал go с https://github.com/dchest/tweetnacl-js прошел профессиональный аудит. API тоже очень простой.

...