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

Ранее в этом месяце, когда мы открыли исходный код browser-file-crypto,
мы упомянули, что "планируем добавить потоковое шифрование".
Теперь эта функция доступна в v1.1.
Зачем понадобилось потоковое шифрование?
Изначальный подход загружал весь файл в память для шифрования. Зашифруйте файл на 500MB — и вы уже используете 500MB+ памяти. Для небольших файлов это нормально, но файлы размером в гигабайты могут уронить вкладку браузера.
В TimeFile мы поддерживаем загрузку файлов от десятков до сотен гигабайт, поэтому столкнулись с этой проблемой напрямую. Чтобы использовать безопасный обмен, файл нужно было зашифровать — но для больших файлов это было просто невозможно.
Решение — обрабатывать файл по чанкам. Если загружать и шифровать только по 64KB за раз, потребление памяти остается постоянным независимо от размера файла.

Что нового?
Функции потокового шифрования/расшифровки
Шифруйте файлы размером в гигабайты без риска переполнения памяти.
1import { encryptFileStream, decryptFileStream } from '@time-file/browser-file-crypto';23const encrypted = await encryptFileStream(largeFile, {4 password: 'secret',5 chunkSize: 64 * 1024, // по умолчанию: 64KB6 onProgress: ({ processedBytes, totalBytes, progress }) => {7 console.log(`${progress}% завершено`);8 }9});
Автоматический режим (гибрид) - рекомендуем
Автоматически выбирает лучший подход по размеру файла. Небольшие файлы используют исходный метод (быстрее), большие — потоковый (эффективнее по памяти).
1import { encryptFileAuto } from '@time-file/browser-file-crypto';23const encrypted = await encryptFileAuto(file, {4 password: 'secret',5 autoStreaming: true,6 streamingThreshold: 100 * 1024 * 1024 // 100MB (по умолчанию)7});8// До 100MB: исходный метод (быстрее)9// Свыше 100MB: потоковый метод (эффективнее по памяти)
Потоковое скачивание + расшифровка
Скачивайте и расшифровывайте большие файлы одновременно.
1import { downloadAndDecryptStream } from '@time-file/browser-file-crypto';23await 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 с одним и тем же ключом.
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+.
Как обновиться
1npm install @time-file/browser-file-crypto@latest
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.

