Sobes.tech
Middle

Dove memorizzerai i token?

sobes.tech AI

Risposta dell'AI

Per memorizzare token, specialmente quelli sensibili (accesso API, sessioni utente), in un'app Android considererò i seguenti luoghi:

  1. SharedPreferences (criptografati o usando EncryptedSharedPreferences) : Adatto per token di piccole dimensioni. EncryptedSharedPreferences (parte della Security Library) fornisce cifratura hardware su dispositivi compatibili, aumentando la sicurezza rispetto alle SharedPreferences normali.

    // Creazione di EncryptedSharedPreferences
    val context: Context = applicationContext
    val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
    
    val sharedPreferences = EncryptedSharedPreferences.create(
        "secure_preferences",
        masterKeyAlias,
        context,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
    )
    
    // Salvataggio del token
    with(sharedPreferences.edit()) {
        putString("auth_token", "tuo_token_sensibile")
        apply()
    }
    
    // Lettura del token
    val authToken = sharedPreferences.getString("auth_token", null)
    
  2. Sistema Android Keystore: Il modo più sicuro per memorizzare chiavi crittografiche e dati sensibili. Le chiavi sono conservate in un'area protetta del dispositivo e non possono essere estratte dall'app. Il Keystore può essere usato per cifrare/decifrare token memorizzati in SharedPreferences o in un database.

    // Esempio di recupero di una chiave dal Keystore (per API livello 23+)
    val keyStore = KeyStore.getInstance("AndroidKeyStore")
    keyStore.load(null)
    val secretKeyEntry = keyStore.getEntry("my_encryption_key_alias", null) as KeyStore.SecretKeyEntry
    val secretKey = secretKeyEntry.secretKey
    // Uso di secretKey per cifrare/decifrare il token
    
  3. Database SQLite (tabelle o colonne criptate): Se ci sono molti token o sono collegati ad altri dati, si può usare un database locale. Per maggiore sicurezza, i dati dei token devono essere memorizzati in colonne criptate o usare una libreria che fornisce cifratura per l'intero database (ad esempio, SQLCipher per Android).

    -- Esempio di creazione di tabella con colonna criptata (dipende dalla libreria)
    CREATE TABLE users (
        id INTEGER PRIMARY KEY,
        username TEXT,
        auth_token BLOB -- Memorizzazione del token criptato
    );
    
  4. Memoria dell'applicazione (RAM): Solo per memorizzazione temporanea del token durante un breve periodo di utilizzo nella sessione corrente. Dopo la fine della sessione o la chiusura dell'app, il token viene estratto e memorizzato in modo più sicuro. Non adatto per memorizzazione persistente.

La scelta dipende da:

  • Confidenzialità del token: Quanto è sensibile il token?
  • Dimensione del token: I token piccoli sono più facili da memorizzare in SharedPreferences o Keystore.
  • Durata del token: È necessario il token dopo aver chiuso l'app?
  • Versioni di Android: La compatibilità con Keystore e EncryptedSharedPreferences varia.

Raccomandazione: Combinare Keystore per la memorizzazione della chiave di cifratura con SharedPreferences criptografati o un database criptato per memorizzare il token stesso. Questo garantisce un alto livello di sicurezza con un uso relativamente semplice.