Налаштування Encrypted SharedPreferences в Android-додатку

Чому варто шифрувати SharedPreferences? Нещодавно в одному з проектів клієнта знайшли вразливість: токен авторизації зберігався у відкритому вигляді. Після зламу через ADB (налагодження було увімкнено в релізній збірці) зловмисники отримали доступ до 10 000 токенів за кілька хвилин. Ми переписали

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Налаштування Encrypted SharedPreferences в Android-додатку
Простий
~1 день

Наші компетенції:

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1003
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    597

Чому варто шифрувати SharedPreferences?

Нещодавно в одному з проектів клієнта знайшли вразливість: токен авторизації зберігався у відкритому вигляді. Після зламу через ADB (налагодження було увімкнено в релізній збірці) зловмисники отримали доступ до 10 000 токенів за кілька хвилин. Ми переписали зберігання на EncryptedSharedPreferences — це закрило вектор атаки повністю. 99% подібних інцидентів пов'язані з незашифрованими даними на пристрої.

Токени, налаштування, ключі API — все це має бути під замком. Навіть якщо додаток не використовує біометрію, шифрування захищає від фізичного доступу, резервних копій та malware. Ми гарантуємо, що дані залишаться конфіденційними завдяки дворівневому шифруванню з Jetpack Security. За 5+ років ми впровадили захист у 20+ проектах — жодного інциденту. Аудит безпеки покаже, що ваш додаток відповідає OWASP Mobile Top 10.

Як працює EncryptedSharedPreferences?

Ініціалізація вимагає майстер-ключа з Android Keystore. Google Tink забезпечує криптостійкість: ключі шифруються AES256-SIV (детерміноване шифрування для пошуку), значення — AES256-GCM. Майстер-ключ зберігається в апаратному сховищі та прив'язаний до пристрою.

val masterKey = MasterKey.Builder(context) .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) .setUserAuthenticationRequired(false) // true якщо потрібна біометрія .build() val prefs = EncryptedSharedPreferences.create( context, "secure_prefs", masterKey, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) 

API ідентичний звичайному SharedPreferencesputString, getString, edit().apply(). Жодного додаткового коду. Однак є нюанси: getAll() не підтримується, а файл прив'язаний до пристрою.

Метрика Plain SharedPreferences EncryptedSharedPreferences
Безпека Дані у відкритому вигляді Дані зашифровані (AES256)
Продуктивність ~0.1 мс на читання ~2–5 мс на читання
Резервне копіювання Повністю копіюється Вимагає виключення з backup_rules.xml

Що саме шифрується і як?

Тип даних До шифрування Після шифрування
Налаштування <string name="theme">dark</string> base64:... (AES256-SIV)
Токени <string name="token">eyJ...J9</string> base64:... (AES256-GCM)

Файл Secure Prefs містить нечитабельний blob. Навіть при фізичному доступі до пристрою дані не розшифрувати без майстер-ключа з Keystore. Наш досвід показує, що такий підхід закриває 99% загроз для зберігання сесійних даних.

Як мігрувати без втрати даних?

Міграція зі звичайних SharedPreferences — типова задача, яку ми виконуємо за 4–8 годин. Покроковий план:

  1. Прочитайте всі ключі зі старого файлу через getAll() (виняток для міграції, після перепишіть на явні виклики).
  2. Запишіть кожен ключ у новий зашифрований файл через edit().putString().
  3. Видаліть старий файл context.deleteSharedPreferences("old_name").
  4. Замініть всі виклики getSharedPreferences в коді на EncryptedSharedPreferences.create.
  5. Додайте android:fullBackupContent="@xml/backup_rules" та виключіть зашифрований файл з Auto Backup.

Важливо: getAll() в EncryptedSharedPreferences не підтримується в продакшені — після міграції перепишіть ітерацію на явні ключі.

Які підводні камені при використанні EncryptedSharedPreferences?

Якщо пристрій перезавантажено, а біометрія увімкнена, фонові worker'и можуть не отримати доступ до даних. Рішення — явно налаштувати setUserAuthenticationRequired(false) і використовувати схему DEVICE_CREDENTIAL. Це гарантує доступ після перезавантаження.

Файл преференцій прив'язаний до Keystore пристрою. Скопіювати його на інший девайс не можна — це захист від ексфільтрації. В ранніх альфа-версіях Jetpack Security (наприклад, 1.1.0-alpha02) була помилка, через яку за певних умов губилися дані — ми врахували це і завжди використовуємо стабільні релізи.

При скиданні пристрою або зміні PIN-коду майстер-ключ може стати недоступним. В такому випадку зашифровані дані губляться безповоротно. Рекомендується завжди мати резервний план — наприклад, токени оновлення зберігати окремо або використовувати хмарне резервування.

Коли Encrypted SharedPreferences недостатньо?

Якщо дані потрібні в background worker без користувача на екрані, а пристрій перезавантажено — потрібен контроль над Android Keystore напряму або використання EncryptedFile для великих об'ємів. Для потокового запису файлів (зображення, логи) краще підходить Jetpack Security EncryptedFile. Він не обмежений за розміром і підтримує потокове шифрування.

Що входить в роботу та терміни

  • Консультація щодо архітектури зберігання даних.
  • Налаштування майстер-ключа (біометрія або без).
  • Міграція всіх існуючих SharedPreferences з урахуванням getAll() та backup_rules.xml.
  • Тестування на API 23+ (більше 30 пристроїв).
  • Документація та рекомендації щодо підтримки.
  • Підтримка після деплою 1 місяць.

Терміни: проста заміна — 4–8 годин з тестуванням. Якщо є Auto Backup та складна конфігурація — додайте ще кілька годин. Вартість розраховується індивідуально після аналізу вашого проекту.

Ми реалізували захист даних для 20+ Android-додатків — жодного інциденту. Отримайте консультацію з безпеки вашого додатка — оцінка займе один день. Зв'яжіться з нами, щоб захистити дані користувачів.