Потоковое шифрование теперь доступно в browser-file-crypto.

Шифруйте большие файлы в браузере без проблем с памятью. Потоковое шифрование добавлено в browser-file-crypto v1.1.

Минкю Ли
Минкю Ли
January 9, 2026
3мин чтения
Потоковое шифрование теперь доступно в browser-file-crypto.

Ранее в этом месяце, когда мы открыли исходный код browser-file-crypto, мы упомянули, что "планируем добавить потоковое шифрование". Теперь эта функция доступна в v1.1.


Зачем понадобилось потоковое шифрование?

Изначальный подход загружал весь файл в память для шифрования. Зашифруйте файл на 500MB — и вы уже используете 500MB+ памяти. Для небольших файлов это нормально, но файлы размером в гигабайты могут уронить вкладку браузера.

В TimeFile мы поддерживаем загрузку файлов от десятков до сотен гигабайт, поэтому столкнулись с этой проблемой напрямую. Чтобы использовать безопасный обмен, файл нужно было зашифровать — но для больших файлов это было просто невозможно.

Решение — обрабатывать файл по чанкам. Если загружать и шифровать только по 64KB за раз, потребление памяти остается постоянным независимо от размера файла.

Сравнение использования памяти
Изначальный подход использует память пропорционально размеру файла. Потоковый режим использует только размер чанка (64KB).

Что нового?

Функции потокового шифрования/расшифровки

Шифруйте файлы размером в гигабайты без риска переполнения памяти.

TypeScript
1import { encryptFileStream, decryptFileStream } from '@time-file/browser-file-crypto';
2
3const encrypted = await encryptFileStream(largeFile, {
4 password: 'secret',
5 chunkSize: 64 * 1024, // по умолчанию: 64KB
6 onProgress: ({ processedBytes, totalBytes, progress }) => {
7 console.log(`${progress}% завершено`);
8 }
9});

Автоматический режим (гибрид) - рекомендуем

Автоматически выбирает лучший подход по размеру файла. Небольшие файлы используют исходный метод (быстрее), большие — потоковый (эффективнее по памяти).

TypeScript
1import { encryptFileAuto } from '@time-file/browser-file-crypto';
2
3const encrypted = await encryptFileAuto(file, {
4 password: 'secret',
5 autoStreaming: true,
6 streamingThreshold: 100 * 1024 * 1024 // 100MB (по умолчанию)
7});
8// До 100MB: исходный метод (быстрее)
9// Свыше 100MB: потоковый метод (эффективнее по памяти)

Потоковое скачивание + расшифровка

Скачивайте и расшифровывайте большие файлы одновременно.

TypeScript
1import { downloadAndDecryptStream } from '@time-file/browser-file-crypto';
2
3await downloadAndDecryptStream(url, {
4 fileName: 'large-file.zip',
5 password: 'secret',
6 onProgress: ({ phase, processedBytes }) => {
7 // phase: 'downloading' | 'decrypting' | 'complete'
8 }
9});

Обратная совместимость

  • decryptFile() автоматически распознает потоковый формат
  • Можно расшифровывать потоково зашифрованные файлы без изменений существующего кода
  • getEncryptionType() теперь возвращает 'password-stream' и 'keyfile-stream'

Как TimeFile это использует

В TimeFile мы управляем потоковым шифрованием через Feature Flag. В безопасном обмене используется encryptFileAuto с autoStreaming: true, чтобы автоматически обрабатывать большие файлы. Это значит, что теперь даже файлы на 100GB можно шифровать прямо в браузере. Пользователю достаточно просто загрузить файл — о размере можно не думать.


Технические детали

Формат потокового файла

Мы используем новые маркеры, чтобы отличать его от исходного формата.

  • 0x11: потоковый режим с паролем (заголовок 34 байта)
  • 0x12: потоковый режим с keyfile (заголовок 18 байт)
Структура потокового формата файла
При потоковом шифровании после заголовка последовательно записываются чанки.

Аутентификация каждого чанка

Каждый чанк размером 64KB получает собственный тег аутентификации AES-GCM (16 байт).

  • Повреждение в любой части файла обнаруживается сразу
  • Целостность можно проверить до расшифровки всего файла
  • Ошибка первого чанка → INVALID_PASSWORD или INVALID_KEYFILE
  • Ошибка последующих чанков → DECRYPTION_FAILED (повреждение данных)

Вывод IV

Каждый чанк должен использовать уникальный IV (Initialization Vector), чтобы сохранить безопасность. В AES-GCM нельзя повторно использовать один и тот же IV с одним и тем же ключом.

Plain Text
1chunk_iv = base_iv XOR chunk_index
  • base_iv: случайное 12-байтное значение, сохраненное в заголовке
  • chunk_index: 0, 1, 2, 3, ...
  • XOR формирует уникальный IV для каждого чанка

Поддержка браузеров

Потоковое шифрование использует API TransformStream.

  • Chrome 67+
  • Firefox 102+
  • Safari 14.1+
  • Edge 79+

Поддерживаются большинство браузеров, выпущенных после 2020 года, а также Node.js 18+.


Как обновиться

npm
Bash
1npm install @time-file/browser-file-crypto@latest
pnpm
Bash
1pnpm add @time-file/browser-file-crypto@latest

Что дальше

Мы рассматриваем поддержку Web Worker. Сейчас шифрование выполняется в основном потоке, поэтому при обработке больших файлов интерфейс может ненадолго зависать.


Ссылки

- npm: https://www.npmjs.com/package/@time-file/browser-file-crypto - GitHub: https://github.com/Time-File/browser-file-crypto - Документация по streaming: docs/streaming.md Отзывы и баг-репорты приветствуются в GitHub Issues.


Подвал