Как защитить данные на устройстве
Что проверяют
Понимаете ли вы, от чего конкретно защищаете данные: от другого приложения, от человека с разблокированным телефоном, от root, от утечки в бэкап. Перечень модных слов без модели угроз здесь не засчитывают. Следом обычно спрашивают, где вы храните токен авторизации.
Как отвечать
Идите по слоям:
- песочница: файлы во внутреннем хранилище приложения (
filesDir, базы Room, DataStore) другим приложениям без root недоступны. Во внешнее хранилище секреты не кладут; - Android Keystore: ключи создаются внутри системы и не извлекаются, на многих устройствах они живут в TEE или StrongBox. Приложение просит зашифровать или расшифровать, но сам ключ не видит;
- шифрование данных: токены и чувствительные поля шифруют AES-GCM ключом из Keystore или через Tink. Jetpack Security с
EncryptedSharedPreferencesпомечена устаревшей, в новый код её не берут. Базу целиком шифруют SQLCipher; - привязка к пользователю:
setUserAuthenticationRequired(true)у ключа иBiometricPromptсCryptoObject. Тогда расшифровка возможна только после биометрии, а не просто после показа окна с отпечатком; - бэкап:
dataExtractionRulesиfullBackupContentисключают секреты из облачной копии и переноса на новое устройство. Ключи Keystore не переносятся, и восстановленные зашифрованные данные всё равно не расшифруются; - утечки: не писать токены в Logcat,
FLAG_SECUREдля экранов с данными карты,android:exported="false"у компонентов, которым не нужен внешний доступ.
Сеть тоже часть ответа: только HTTPS, при targetSdk 28 и выше cleartext запрещён по умолчанию, при необходимости пиннинг сертификата через Network Security Config.
Где спотыкаются
Называют обфускацию R8 защитой данных. Она усложняет чтение кода, но ключ API или секрет, зашитый в APK, всё равно достаётся за минуты.
Шифруют данные ключом, который лежит рядом в SharedPreferences или в коде. Это обёртка, а не защита: кто прочитал файл, прочитает и ключ.
Путают системное шифрование устройства с защитой приложения. Оно спасает при краже заблокированного телефона, но на разблокированном устройстве с root данные приложения читаются как есть.