Какие механизмы шифрования использовать
Что проверяют
Знаете ли вы, что в Android главная проблема не выбор алгоритма, а хранение ключа, и умеете ли пользоваться Android Keystore. Следом обычно спрашивают, что не так с Cipher.getInstance("AES") или где хранить токен авторизации.
Как отвечать
Сначала разделите задачи: данные в покое, данные в передаче и пароли.
- симметричное шифрование: AES в режиме GCM (
AES/GCM/NoPadding), ключ 256 бит, новый случайный IV 12 байт на каждое шифрование, тег 128 бит. GCM даёт не только конфиденциальность, но и проверку целостности; - Android Keystore: ключ создаётся через
KeyGeneratorсKeyGenParameterSpecи не покидает защищённое хранилище, приложение получает только ссылку. На устройствах с отдельным чипом можно запроситьsetIsStrongBoxBacked(true), аsetUserAuthenticationRequired(true)вместе сBiometricPromptиCryptoObjectпривязывает ключ к биометрии; - асимметричное: RSA с OAEP или ECDH для обмена ключами, ECDSA для подписи. Большие данные шифруют симметричным ключом, а асимметрией защищают только сам ключ;
- пароли: не шифруют, а хэшируют медленной функцией вроде Argon2 или PBKDF2 с солью;
- передача: только TLS, для чувствительных приложений certificate pinning через Network Security Config.
Про библиотеки: EncryptedSharedPreferences из androidx.security:security-crypto объявлена устаревшей, в новых проектах используют Keystore напрямую или Tink. Для базы данных есть SQLCipher, Spongy Castle давно не поддерживается.
Шифрование устройства на уровне файлов защищает выключенный или заблокированный телефон, но не данные на разблокированном устройстве с root-доступом. Поэтому чувствительное шифруют ещё и в приложении.
Где спотыкаются
Пишут Cipher.getInstance("AES"). На Android это означает режим ECB, где одинаковые блоки шифруются одинаково и структура данных остаётся видна.
Хранят ключ в коде или в BuildConfig. Декомпиляция APK достаёт его за минуты, обфускация лишь немного замедляет.
Переиспользуют IV с тем же ключом в GCM. Для этого режима это катастрофа: повтор пары раскрывает XOR открытых текстов и позволяет подделывать сообщения.