Налаштування Encrypted SharedPreferences в Android-додатку
Коли додатку не потрібна біометрія або складна схема ключів, але токени у plaintext SharedPreferences — очевидний ризик, EncryptedSharedPreferences з Jetpack Security закриває 80% кейсів за півдня.
Що саме шифрується
EncryptedSharedPreferences використовує бібліотеку Tink від Google з двоповерховим шифруванням: ключи шифруються AES256-SIV (детерміноване шифрування, дозволяє пошук за ключем), значення — AES256-GCM. Мастер-ключ зберігається в Android Keystore. Результат: XML-файл преференцій містить нечитаємий blob замість <string name="auth_token">eyJhb...</string>.
Ініціалізація
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 ідентичний звичайному SharedPreferences — putString, getString, edit().apply(). Жодного додаткового коду.
Важливі обмеження
EncryptedSharedPreferences не підтримує getAll() — метод викидає UnsupportedOperationException. Якщо код де-небудь ітерує всі ключі, потрібен рефакторинг перед міграцією.
Файл преференцій не можна копіювати між пристроями — мастер-ключ привязаний до Keystore конкретного пристрою. Важливе обмеження, про яке потрібно попередити при міграції з звичайних SharedPreferences: відновлення з бекапу (Auto Backup) не принесе зашифровані дані.
Jetpack Security версія 1.1.0-alpha (та вище) стабілізувала API після довгого альфа-періоду. Використовуйте не нижче 1.1.0-alpha06 — у раніших версіях є відомий баг з пошкодженням файлу при певних умовах запису.
Коли EncryptedSharedPreferences недостатньо
Якщо дані потрібні в background worker без користувача на екрані, і пристрій може бути перезавантажений, потрібен явний контроль над схемами доступу, тобто прямої роботи з Keystore з правильним setUserAuthenticationRequired(false). EncryptedSharedPreferences використовує BIOMETRIC_STRONG or DEVICE_CREDENTIAL якщо біометрія включена, що може заблокувати фоновий доступ.
Для великих даних (файли, БД) використовуйте EncryptedFile з того ж Jetpack Security, не SharedPreferences.
Часові рамки
Проста заміна SharedPreferences на EncryptedSharedPreferences: 4–8 годин включаючи тестування на декількох API рівнях. Якщо присутня Auto Backup та потрібно правильно налаштувати backup_rules.xml для виключення зашифрованого файлу з бекапу — додайте ще кілька годин.







