Где хранить токены

«Где хранить токены» — вопрос из категории Android компоненты, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Хранить токены нужно в EncryptedSharedPreferences или Keystore для безопасности.

EncryptedSharedPreferences (проще в использовании):

val masterKey = MasterKey.Builder(context)
    .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
    .build()

val sharedPreferences = EncryptedSharedPreferences.create(
    context,
    "secure_prefs",
    masterKey,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

sharedPreferences.edit().putString("ACCESS_TOKEN", token).apply()

Android Keystore (более безопасно, но сложнее):

val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) }
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
val key = KeyGenerator.getInstance("AES", "AndroidKeyStore").apply {
    init(KeyGenParameterSpec.Builder("token_key", KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
        .build())
}.generateKey()

cipher.init(Cipher.ENCRYPT_MODE, key)
val encryptedToken = cipher.doFinal(token.toByteArray())

⚠️ Не храните токены в:

  • Обычных SharedPreferences
  • SQLite без шифрования
  • Памяти (если не очищается после использования)
  • Файлах или Intent-ах