Ответ
Хранить токены нужно в 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-ах