[{"data":1,"prerenderedAt":23},["ShallowReactive",2],{"articolo-gestione-sicura-dei-dati-sensibili-in-flutter-con-flutter-secure-storage":3,"comments-article-gestione-sicura-dei-dati-sensibili-in-flutter-con-flutter-secure-storage":22},{"id":4,"title":5,"slug":6,"excerpt":7,"body":8,"cover_image":9,"video_url":10,"status":11,"published_at":12,"meta_title":13,"meta_description":14,"category":15,"author":19},25,"Gestione sicura dei dati sensibili in Flutter con flutter_secure_storage","gestione-sicura-dei-dati-sensibili-in-flutter-con-flutter-secure-storage","Token, credenziali e dati sensibili non vanno salvati in chiaro. Scopri come usare flutter_secure_storage per sfruttare Keychain su iOS e Keystore su Android in modo sicuro.","## Perché non basta SharedPreferences\n\nQuando si sviluppa un'app reale, prima o poi bisogna salvare informazioni sensibili: token di autenticazione, refresh token, chiavi API o credenziali utente. Una tentazione comune è usare `SharedPreferences` (o `shared_preferences` in Flutter), ma è un errore: i dati vengono salvati **in chiaro** in un file XML su Android e nelle preferenze su iOS, facilmente leggibili su dispositivi compromessi o con root\u002Fjailbreak.\n\nLa soluzione corretta è il pacchetto [`flutter_secure_storage`](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fflutter_secure_storage), che sfrutta i sistemi di sicurezza nativi delle piattaforme:\n\n- **iOS\u002FmacOS**: Keychain\n- **Android**: Keystore con cifratura AES (tramite `EncryptedSharedPreferences`)\n- **Linux\u002FWindows\u002FWeb**: implementazioni dedicate (con alcune limitazioni)\n\n## Installazione\n\nAggiungi il pacchetto al `pubspec.yaml`:\n\n```yaml\ndependencies:\n  flutter_secure_storage: ^9.2.2\n```\n\nSu Android assicurati che il `minSdkVersion` sia almeno **18** nel file `android\u002Fapp\u002Fbuild.gradle`:\n\n```gradle\ndefaultConfig {\n    minSdkVersion 18\n}\n```\n\n## Operazioni di base\n\nL'API è semplice e completamente asincrona. Ecco le operazioni fondamentali:\n\n```dart\nimport 'package:flutter_secure_storage\u002Fflutter_secure_storage.dart';\n\nfinal storage = const FlutterSecureStorage();\n\n\u002F\u002F Scrittura\nawait storage.write(key: 'auth_token', value: 'eyJhbGciOiJI...');\n\n\u002F\u002F Lettura\nfinal token = await storage.read(key: 'auth_token');\n\n\u002F\u002F Cancellazione di una singola chiave\nawait storage.delete(key: 'auth_token');\n\n\u002F\u002F Cancellazione di tutto\nawait storage.deleteAll();\n\n\u002F\u002F Verifica esistenza\nfinal exists = await storage.containsKey(key: 'auth_token');\n```\n\n## Configurare le opzioni di sicurezza\n\nÈ buona pratica configurare esplicitamente le opzioni per ciascuna piattaforma. Su Android puoi forzare l'uso di `EncryptedSharedPreferences`, su iOS puoi definire l'accessibilità del Keychain:\n\n```dart\nfinal storage = const FlutterSecureStorage(\n  aOptions: AndroidOptions(\n    encryptedSharedPreferences: true,\n  ),\n  iOptions: IOSOptions(\n    accessibility: KeychainAccessibility.first_unlock,\n  ),\n);\n```\n\nIl valore `KeychainAccessibility.first_unlock` indica che il dato è accessibile solo dopo il primo sblocco del dispositivo dall'ultimo riavvio: un buon compromesso tra sicurezza e usabilità (ad esempio per i task in background).\n\n## Un repository per i token\n\nNelle app reali conviene incapsulare l'accesso al secure storage in una classe dedicata, così da isolare la dipendenza e facilitare i test:\n\n```dart\nclass TokenStorage {\n  TokenStorage(this._storage);\n\n  final FlutterSecureStorage _storage;\n\n  static const _accessKey = 'access_token';\n  static const _refreshKey = 'refresh_token';\n\n  Future\u003Cvoid> saveTokens({\n    required String accessToken,\n    required String refreshToken,\n  }) async {\n    await Future.wait([\n      _storage.write(key: _accessKey, value: accessToken),\n      _storage.write(key: _refreshKey, value: refreshToken),\n    ]);\n  }\n\n  Future\u003CString?> get accessToken => _storage.read(key: _accessKey);\n  Future\u003CString?> get refreshToken => _storage.read(key: _refreshKey);\n\n  Future\u003Cvoid> clear() async {\n    await Future.wait([\n      _storage.delete(key: _accessKey),\n      _storage.delete(key: _refreshKey),\n    ]);\n  }\n}\n```\n\nQuesto pattern si integra perfettamente con la dependency injection: puoi registrare `TokenStorage` e iniettarlo dove serve, ad esempio in un interceptor di Dio per aggiungere automaticamente l'header `Authorization`.\n\n## Gestire le eccezioni\n\nLe letture possono fallire, ad esempio quando si aggiorna una libreria di cifratura o si cambia configurazione su Android. È prudente gestire l'errore e ripulire lo storage in caso di dato corrotto:\n\n```dart\nFuture\u003CString?> readSafely(String key) async {\n  try {\n    return await storage.read(key: key);\n  } on PlatformException catch (_) {\n    \u002F\u002F Dato non decifrabile: meglio rimuoverlo\n    await storage.delete(key: key);\n    return null;\n  }\n}\n```\n\n## Buone pratiche\n\n- **Non memorizzare dati enormi**: il secure storage è pensato per stringhe brevi (token, chiavi), non per file o grandi quantità di dati.\n- **Cancella i token al logout**: chiama sempre `clear()` per evitare che restino accessibili.\n- **Attenzione al Web**: l'implementazione web usa cifratura ma è meno robusta dei keystore nativi; valuta strategie alternative se il target è critico.\n- **Backup Android**: disabilita il backup automatico delle chiavi nel `AndroidManifest.xml` per evitare che dati cifrati finiscano nei backup cloud.\n\n```xml\n\u003Capplication\n    android:allowBackup=\"false\"\n    android:fullBackupContent=\"false\">\n```\n\n## Conclusione\n\nProteggere i dati sensibili non è opzionale: `flutter_secure_storage` offre un'API semplice che si appoggia ai meccanismi di sicurezza nativi di ogni piattaforma. Incapsulando l'accesso in un repository dedicato e configurando correttamente le opzioni, otterrai una gestione delle credenziali robusta, testabile e conforme alle aspettative di sicurezza degli utenti.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Farticles\u002F1bed2040-3f83-4c99-8935-746e7c2b6a22.jpg",null,"published","2026-06-29T04:00:36+00:00","Dati sicuri in Flutter con flutter_secure_storage","Come salvare token e credenziali in modo sicuro in Flutter usando flutter_secure_storage con Keychain e Keystore. Guida pratica con esempi e best practice.",{"id":16,"name":17,"slug":18},3,"Best practice","best-practice",{"id":20,"name":21},1,"Flutter Bot",[],1785219604112]