Мобильное шифрование для передачи файлов: безопасный обмен в пути
Обеспечьте сквозное шифрование мобильных передач. Как браузерное шифрование работает на iOS и Android.
Мобильное шифрование файлов работает в Safari на iOS и Chrome/Firefox на Android через Web Crypto API — тот самый вызов crypto.subtle.encrypt, который функционирует и на десктопе. Файлы из библиотеки Photos или приложения Files шифруются с помощью AES-256-GCM до того, как хотя бы один байт покидает телефон. Самая тяжёлая операция — деривация ключа PBKDF2: на iPhone 14 Pro 600 000 итераций завершаются примерно за 350 мс. Для видеофайла .mov размером 500 МБ с недавней поездки настоящим узким местом является пропускная способность при загрузке, а не шифрование. Сервисам передачи файлов с приоритетом мобильных устройств не нужны нативные приложения — браузер содержит всё необходимое.
Почему браузерный подход лучше нативных приложений
Нативные приложения для передачи файлов на iOS и Android (Dropbox, приложение WeTransfer до 2023 года) запрашивают широкие разрешения, остаются в памяти после использования и показывают рекламу. Браузерный рабочий процесс не требует установки, выполняется один раз и завершается при закрытии вкладки. Важнее другое: отклонение App Store от Apple настоящих приложений с нулевым знанием (задокументированная ситуация с Cryptee в 2021 году) делает доставку через браузер единственным способом гарантировать, что логика шифрования не будет молча подменена обновлением из магазина. Один и тот же JavaScript-бандл работает везде, проверяемый по SHA-384-хешам.
Web Crypto API на iOS и Android
Safari 17 на iOS 17+ полностью поддерживает crypto.subtle: deriveKey, encrypt, decrypt, sign, verify. Chrome на Android поддерживает его с версии 37 (2014). Обе реализации делегируют работу нативным примитивам ОС — CommonCrypto на iOS, BoringSSL на Android — поэтому крипто аппаратно ускорено через AES-инструкции ARM. Фрагмент 5 МБ шифруется примерно за 15 мс на Pixel 8. API не раскрывает исходный ключевой материал JavaScript (объекты CryptoKey — непрозрачные дескрипторы), что помогает защититься от вредоносных расширений, хотя в мобильных браузерах их значительно меньше.
Работа с большими файлами без переполнения памяти
Mobile Safari ограничивает кучу JavaScript примерно 2 ГБ на iPhone с 6 ГБ RAM, ещё меньше на старых устройствах. Наивный подход «прочитать файл в ArrayBuffer, зашифровать, загрузить» приводит к сбою на всём, что превышает 1 ГБ. Потоковая обработка обязательна. Используйте File.slice() для чтения фрагментов по 5 МБ, шифруйте каждый с подключом, производным через HKDF, и загружайте через fetch() с телом ReadableStream. Прогрессивная загрузка удерживает пиковое использование памяти ниже 50 МБ даже для 10-гигабайтных видеофайлов. Chrome на Android поддерживает потоковые запросы fetch с версии 105; Safari добавил полную поддержку в 17.4.
Аккумулятор и тепловые условия
AES-256-GCM дёшев аппаратно — расширения криптографии ARMv8 позволяют ему работать почти на скорости DRAM. Шифрование 1 ГБ на iPhone 14 Pro потребляет около 2% заряда, причём в основном за счёт радио при загрузке, а не ЦП. Пользователи ощущают нагрев при PBKDF2 с большим количеством итераций; 1,2 миллиона итераций (рекомендация OWASP 2024) занимают 700 мс и кратко разгоняют A17 до 90°C. Снижение итераций до 600 000 балансирует безопасность и тепловой режим. Argon2id с m=32 МБ мягче при длительных нагрузках, поскольку устойчивость к памяти медленнее, но менее энергоёмка.
Надёжность загрузки по сотовой сети и Wi-Fi
Мобильные загрузки прерываются. Тоннель в метро, лифт, переключение с Wi-Fi на LTE — любое из них обрывает наивный fetch(). Надёжная мобильная передача использует возобновляемые загрузки с подтверждением на уровне фрагментов, протоколы вроде tus.io (спецификация tus 1.0, широко поддерживается) или составные загрузки S3. Каждый фрагмент по 5 МБ загружается независимо; при сбое повторно отправляется только этот фрагмент. Клиент хранит состояние фрагментов в IndexedDB, поэтому перезагрузка вкладки браузера или вытеснение вкладки iOS не перезапускает всю задачу. SwissTransfer и HexaTransfer реализуют возобновляемые загрузки; мобильный веб-интерфейс WeTransfer этого не делает, из-за чего загрузки 2 ГБ через LTE там часто завершаются неудачей.
Ввод пароля и проблема UX
Вводить 16-символьный надёжный пароль на мобильной клавиатуре — неприятно. Предлагайте альтернативы: сканирование QR-кода с экрана отправителя, вставку из нативного менеджера паролей (iOS заполняет из Keychain через эквиваленты .well-known/apple-app-site-association для веба), или использование passkey, зарегистрированного при предыдущей передаче. Для разовых случаев используйте Web Share Target API, чтобы компаньонское приложение (например, Signal) могло передать пароль без повторного ввода.
Доступность и малые экраны
iPhone SE с 4,7 дюйма не вмещает полноценный интерфейс с перетаскиванием. Мобильные интерфейсы шифрования должны учитывать вьюпорт: полноэкранный выбор файлов, индикаторы прогресса, видимые над экранной клавиатурой, метки VoiceOver на каждой кнопке (role="progressbar" с aria-valuenow для доступности) и минимальная область касания 44×44 пикселя согласно Apple HIG. Не скрывайте элементы управления за состояниями hover — на сенсорном экране hover отсутствует. Тестируйте с iOS Low Power Mode, который ограничивает фоновые таймеры и ломает обновление прогресса на основе опроса.
Особенности Safari на iOS
Safari на iOS содержит ловушки. События прогресса загрузки в Fetch API ненадёжно срабатывали до iOS 16.4. File System Access API не поддерживается, поэтому нельзя потоково читать большие файлы из локального хранилища, как это делает Chrome. Safari агрессивно вытесняет неактивные вкладки при давлении памяти, что обрывает загрузки в процессе. Способы обхода: использовать XMLHttpRequest с событиями прогресса как фолбэк (по-прежнему работает), держать вкладку на переднем плане во время загрузки и предупреждать пользователя не блокировать экран при больших файлах. Экран без блокировки разряжает аккумулятор, но предотвращает вытеснение вкладки.
Фрагментация устройств на Android
Android охватывает от Pixel 8 Pro до устройств Moto e14 за $80 на Android Go. Web Crypto работает на всех, но производительность резко варьируется — MT6762 на 2 ГГц занимает 1,8 секунды для 600 000 итераций PBKDF2, тогда как телефон класса Apple M3 справляется за 200 мс. Определяйте устройство через Device Memory API и Hardware Concurrency, масштабируйте количество итераций соответственно (снижайте до 300 000 для устройств Go) и предупреждайте пользователей с подключением только через сотовую сеть, что загрузки свыше 1 ГБ могут быть ненадёжными. Преимущество: зашифрованная передача работает на большинстве телефонов в мире без необходимости флагманского устройства.
Попробуйте на hexatransfer.com — бесплатно, без регистрации, до 10 ГБ.
Безопасная отправка больших файлов со сквозным шифрованием
Передавайте файлы до 10 ГБ бесплатно со сквозным шифрованием. Регистрация не требуется. Ваши файлы шифруются в браузере перед загрузкой — никто другой не может их прочитать.
Отправить файл