Revault шифрует большой файл сегментами примерно по 5 MiB, у каждого из которых свой тег аутентификации, поэтому весь файл никогда не должен целиком находиться в памяти. Именно это позволяет веб-приложению работать с файлами размером до 1 GiB.
Почему бы не шифровать весь файл сразу?
Большие файлы не должны требовать большого объема памяти. Revault читает файлы сегментами размером примерно 5 МБ, шифрует каждый сегмент в браузере и помещает зашифрованный текст в IndexedDB. Исходный файл никогда не считывается в один гигантский буфер.
Работа сегментами также означает, что прерванная загрузка может продолжиться с уже подготовленного шифротекста, без повторного шифрования всего файла.
Что защищает порядок и целостность сегментов?
Каждый файл получает собственный ключ шифрования, производный от главного ключа хранилища через HKDF. Контекст вывода ключа включает идентификаторы хранилища и файла, длину файла в байтах и размер сегмента.
12-байтовый nonce каждого сегмента объединяет случайный префикс, выбранный для этого файла, четырёхбайтовый счётчик сегментов и флаг последнего сегмента. Сегменты снабжены 128-битными тегами GCM. Если сегменты переставлены, изменены или обрезаны, проверка не проходит.
Что происходит при прерывании загрузки?
После завершения шифрования загрузка по сети может возобновиться из кэшированного зашифрованного текста после обновления страницы. Повторные попытки отправляют одни и те же зашифрованные байты, а не шифруют новый источник под старыми одноразовыми номерами. Если само шифрование прервано, отмените незавершенную загрузку и начните заново с новым идентификатором файла.
Как проверяются скачанные файлы?
При скачивании каждый сегмент проверяется перед выдачей. Поскольку проверка идёт по мере передачи файла, ошибка в конце скачивания может оставить неполный файл, поэтому убедитесь, что скачивание успешно завершилось, прежде чем полагаться на файл.
Какие есть ограничения?
В веб-приложении размер каждого файла может достигать 1 GiB. Для предпросмотра изображений и видео действует отдельный лимит памяти. Очистка локального хранилища браузера может удалить шифротекст, необходимый для возобновления загрузки.
Формат потоковой передачи соответствует задокументированной конструкции потоковой передачи Tink AES-GCM-HKDF с использованием собственных примитивов Web Crypto. Идентификатор файла и ожидаемая длина привязаны к контексту получения ключа; счетчики сегментов и последний маркер защищают порядок и завершение. Данная реализация не прошла независимый криптографический аудит.
На странице модели безопасности описана полная схема, включая заголовок потока и вывод ключей.