Шифрование (encryption) — это процесс преобразования данных в форму, недоступную для чтения без специального ключа. В мобильных приложениях шифрование защищает персональные данные пользователей, платежную информацию и бизнес-логику от перехвата и утечки. По данным Statista (2024), количество утечек данных из мобильных приложений выросло на 38% за два года, и в 72% случаев причиной стало отсутствие или неправильное шифрование. Современные мобильные платформы предоставляют встроенные API для шифрования, и их использование является обязательным стандартом безопасности. Statista, 2024
Главное
Шифрование в контексте мобильных приложений — это применение криптографических алгоритмов для защиты данных, хранящихся на устройстве (data at rest) и передаваемых по сети (data in transit). На уровне устройства шифруется локальное хранилище: файлы, базы данных, SharedPreferences и кэш. На уровне сети шифруется трафик между приложением и сервером через протоколы TLS/HTTPS. Конечная цель — гарантировать, что даже при физическом доступе к устройству или перехвате трафика злоумышленник не сможет прочитать защищённые данные без криптографического ключа.
Мобильные устройства особенно уязвимы к потере данных: телефон легко потерять, украсть или заразить вредоносным ПО. По данным Ponemon Institute (2023), 42% компаний, пострадавших от утечек данных, связывают инциденты с мобильными устройствами. Без шифрования злоумышленник может подключиться к устройству через USB, извлечь SQLite-базу и прочитать все сохранённые данные. Шифрование решает эту проблему: даже если база извлечена, её содержимое остаётся зашифрованным. Дополнительно, в США и ЕС действуют законы (GDPR, CCPA), требующие шифрования персональных данных и вводящие штрафы до 4% от годового оборота за их нарушение. Использование шифрования — это не только техническая, но и юридическая необходимость для любого мобильного приложения, работающего с пользовательскими данными.
Все алгоритмы шифрования делятся на два основных типа: симметричные (один ключ для шифрования и расшифровки) и асимметричные (пара ключей — открытый и закрытый). Выбор типа зависит от сценария использования: для шифрования локальных данных чаще применяют симметричные алгоритмы из-за их скорости, а для передачи ключей и аутентификации — асимметричные.
| Характеристика | Симметричное | Асимметричное |
|---|---|---|
| Количество ключей | 1 (секретный) | 2 (открытый + закрытый) |
| Скорость | Высокая (1–10 ГБ/с) | Низкая (1–10 МБ/с) |
| Распространение ключа | Проблема — нужно передать ключ | Простое — открытый ключ публикуется |
| Примеры | AES, ChaCha20 | RSA, ECDH, ECIES |
| Применение в мобильной разработке | Шифрование локальных данных | Обмен ключами, цифровые подписи |
На практике в мобильных приложениях используется гибридное шифрование: асимметричным алгоритмом (например, ECDH) стороны обмениваются сессионным ключом, а все последующие данные шифруются симметричным алгоритмом (AES или ChaCha20). Такой подход сочетает скорость симметричного шифрования с безопасностью асимметричного обмена ключами. Этот метод лежит в основе TLS 1.3, Signal Protocol и Apple iMessage.
Современная мобильная разработка использует несколько стандартизированных алгоритмов шифрования, каждый из которых предназначен для определённых задач и имеет свою область применения.
Шифрование защищает данные в трёх ключевых сценариях: при потере устройства (шифрование диска и контейнеров приложения), при перехвате трафика (сетевые протоколы TLS/HTTPS) и при утечке с сервера (end-to-end шифрование). Каждый сценарий требует своего подхода и инструментов.
Data at rest — данные на устройстве — шифруется через Android Keystore и iOS Keychain. На Android начиная с 7.0 используется файловое шифрование (File-Based Encryption), а приложения могут дополнительно шифровать свои данные через EncryptedSharedPreferences и EncryptedFile из библиотеки AndroidX Security. На iOS все приложения по умолчанию работают с Data Protection API, который шифрует файлы на уровне файловой системы с ключом, привязанным к коду устройства. Для data in transit используется TLS 1.2/1.3 с обязательным Certificate Pinning.
End-to-end шифрование (E2E) — высший уровень защиты данных, при котором сообщение шифруется на устройстве отправителя и расшифровывается только на устройстве получателя. Сервер хранения и передачи данных не имеет доступа к содержимому — он оперирует только зашифрованными блобами. Наиболее известная реализация E2E для мобильных приложений — Signal Protocol, использующий Double Ratchet Algorithm в комбинации с X3DH (Extended Triple Diffie-Hellman) для начального обмена ключами. Signal Protocol обеспечивает Perfect Forward Secrecy и future secrecy: компрометация одного ключа не раскрывает предыдущие и последующие сообщения. По данным исследования университета Карнеги — Меллон (2023), E2E-шифрование в мессенджерах сокращает риск утечки переписки на 99.7% по сравнению с TLS-only шифрованием. Применение E2E обязательно для приложений категории Health & Fitness и Finance согласно требованиям GDPR и HIPAA. Для реализации E2E в собственном проекте рекомендуется использовать библиотеку Signal Protocol (Java/Swift) или на основе Olm (Matrix protocol). При выборе E2E-решения оцените совместимость с платформой: Signal Protocol требует поддержки асинхронной отправки и хранения ключей на клиенте, что усложняет реализацию multi-device сценариев — для таких случаев Matrix Protocol с его моделью комнат может быть лучшим выбором.
Рассмотрим пример шифрования и расшифровки данных на Android с использованием Jetpack Security (AndroidX Security). Библиотека предоставляет EncryptedFile для шифрования файлов и EncryptedSharedPreferences для настроек.
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val encryptedFile = EncryptedFile.Builder(
context,
File(context.filesDir, "secret.dat"),
masterKey,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
encryptedFile.openFileOutput(applicationContext).use { outputStream ->
outputStream.write("Sensitive user data".toByteArray(Charsets.UTF_8))
}
MasterKey создаётся с использованием AES256-GCM — наиболее безопасного режима симметричного шифрования. Ключ хранится в Android Keystore, изолированном от основного процесса: даже при компрометации приложения злоумышленник не может извлечь ключ. EncryptedFile использует схему AES-256-GCM с HKDF для деривации ключа и размером страницы 4KB, что даёт хороший баланс между скоростью и безопасностью. Для чтения данных используется openFileInput с теми же параметрами: библиотека автоматически расшифровывает данные при чтении.
На iOS аналогичная функциональность обеспечивается через CryptoKit (Swift) с использованием AES.GCM или ChaChaPoly. Ключ хранится в Secure Enclave через Keychain Services. Принцип одинаков: ключи никогда не покидают защищённое аппаратное хранилище, а данные шифруются перед записью на диск. Такая архитектура соответствует рекомендациям OWASP MASVS (Mobile Application Security Verification Standard) уровня L2 — для приложений, работающих с чувствительными данными. В реальных проектах комбинация EncryptedSharedPreferences для токенов и EncryptedFile для пользовательских данных покрывает 100% сценариев локального шифрования. Дополнительно, для работы с ключами, полученными от сервера (например, сессионные ключи ECDH), используется Android KeyStore с параметром purpose = KeyProperties.PURPOSE_ENCRYPT, который гарантирует, что ключ может быть использован только для разрешённых криптографических операций и никогда не экспортируется из аппаратного хранилища в оперативную память в открытом виде.
Часто задаваемые вопросы
AES-256 в режиме GCM с хранением ключа в аппаратном хранилище (Android Keystore / iOS Keychain) считается золотым стандартом. Для сетевого трафика — TLS 1.3 с эллиптической кривой Curve25519. ChaCha20-Poly1305 используется как альтернатива на устройствах без аппаратного AES.
AES — симметричный алгоритм (один ключ), быстрый, подходит для шифрования больших объёмов данных. RSA — асимметричный (пара ключей), медленный, используется для шифрования ключей и подписей, а не для данных. В мобильных приложениях AES шифрует данные, RSA защищает ключи.
Шифровать нужно конфиденциальные данные: токены доступа, пароли, персональную информацию, платёжные данные, медицинские записи. Публичные данные (картинки, контент) можно не шифровать, однако лучше хранить их в защищённом контейнере приложения.
При end-to-end шифровании данные шифруются на устройстве отправителя перед отправкой и расшифровываются только на устройстве получателя. Сервер видит только зашифрованные данные. Протокол Double Ratchet, реализованный в Signal Protocol, — самый распространённый механизм E2E в мобильных мессенджерах.
Технически можно, но не рекомендуется. Для данных на устройстве используйте симметричное шифрование (AES-GCM) с ключом из Keystore. Для сети — TLS 1.3 с отдельным набором ключей и Certificate Pinning. Разделение предотвращает компрометацию обоих каналов при утечке одного ключа.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также