Шифрування (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) та при витоку з сервера (наскрізне шифрування). Кожен сценарій потребує свого підходу та інструментів.
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.
Наскрізне шифрування (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 захищає ключі.
Шифрувати потрібно конфіденційні дані: токени доступу, паролі, персональну інформацію, платіжні дані, медичні записи. Публічні дані (картинки, контент) можна не шифрувати, однак краще зберігати їх у захищеному контейнері застосунку.
При наскрізному шифруванні дані шифруються на пристрої відправника перед відправкою та розшифровуються лише на пристрої отримувача. Сервер бачить лише зашифровані дані. Протокол Double Ratchet, реалізований у Signal Protocol, — найпоширеніший механізм E2E в мобільних месенджерах.
Технічно можна, але не рекомендується. Для даних на пристрої використовуйте симетричне шифрування (AES-GCM) з ключем із Keystore. Для мережі — TLS 1.3 з окремим набором ключів та Certificate Pinning. Розділення запобігає компрометації обох каналів при витоку одного ключа.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також