La classe
EncryptedLocalStore
(ELS) fornisce un meccanismo crittografato di memoria locale che può essere utilizzato come piccola cache per i dati privati di un'applicazione. I dati ELS non possono essere condivisi tra applicazioni diverse. L'intento di ELS è quello di consentire a un'applicazione di memorizzare facilmente gli oggetti ricreati, ad esempio le credenziali di accesso e altre informazioni private. I dati ELS non devono essere considerati permanenti, come descritto in "Limiti dell'archivio locale crittografato" e "Procedure ottimali per l'uso dell'archivio ELS", di seguito.
Nota:
oltre all'archivio locale crittografato, in AIR è disponibile anche una funzione per crittografare il contenuto archiviato in database SQL. Per ulteriori dettagli, consultate
Uso della crittografia con i database SQL
.
È possibile utilizzare l'archivio locale crittografato per memorizzare nella cache informazioni che devono essere garantite, come le credenziali di accesso per i servizi web. L'archivio ELS è indicato per memorizzare informazioni che devono rimanere private e nascoste agli altri utenti. Tuttavia, non protegge i dati da altri processi eseguiti dallo stesso account utente. Non è quindi adatto per proteggere i dati di un'applicazione, ad esempio i dati DRM o le chiavi di crittografia.
Sulle piattaforme desktop, per associare l'archivio locale crittografato a ogni applicazione e utente, AIR usa DPAPI in Windows, KeyChain in Mac OS e iOS e KeyRing o KWallet in Linux. L'archivio locale crittografato utilizza la crittografia AES-CBC a 128 bit.
Su Android, i dati memorizzati dalla classe EncryptedLocalStorage non sono crittografati. Sono invece protetti dalla sicurezza a livello di utente fornita dal sistema operativo. Il sistema operativo Android assegna a ogni applicazione un ID utente distinto. Le applicazioni possono accedere esclusivamente ai propri file e ai file creati in percorsi pubblici (quali schede di memoria rimovibili). Tenete presente che sui dispositivi Android “originari”, le applicazioni eseguite con privilegi principali POSSONO accedere ai file di altre applicazioni. Di conseguenza, su un dispositivo originario, il livello di protezione dei dati fornito dall'archivio locale crittografato non è altrettanto elevato quanto quello fornito dall'archivio locale di dispositivi non originari.
Le informazioni nell'archivio locale crittografato sono disponibili solo per il contenuto dell'applicazione AIR nella sandbox di sicurezza dell'applicazione.
Se aggiornate un'applicazione AIR, la versione aggiornata conserva i dati dell'archivio locale crittografato a meno che:
-
Gli elementi non siano stati aggiunti con il parametro
stronglyBound
impostato su
true
-
La versione corrente e quella aggiornata non siano state entrambe pubblicate prima di AIR 1.5.3 e l'aggiornamento sia stato firmato con una firma di migrazione.
Limiti dell'archivio locale crittografato
I dati dell'archivio locale crittografato sono protetti dalle credenziali dell'account del sistema operativo dell'utente. Altre entità non possono accedere ai dati dell'archivio a meno che non accedano a tale account. Tuttavia, i dati non sono protetti dall'accesso di altre applicazioni eseguite da un utente autenticato.
Poiché per il successo degli attacchi l'utente deve essere autenticato, i dati privati dell'utente sono ancora protetti (a meno che l'account utente stesso non sia compromesso). Tuttavia, i dati che l'applicazione desidera mantenere segreti, ad esempio le chiavi utilizzate per la gestione delle licenze o per il DRM (Digital Rights Management), non sono sicuri. L'ELS non è pertanto una posizione appropriata per la memorizzazione di queste informazioni, È appropriato solo per l'archiviazione dei dati privati di un utente, ad esempio le password.
La perdita dei dati dell'archivio ELS si può verificare in varie circostanze. Ad esempio, l'utente potrebbe disinstallare l'applicazione ed eliminare il file crittografato. Oppure, l'ID editore potrebbe cambiare a seguito di un aggiornamento. Si consiglia pertanto di gestire l'ELS come una cache privata e non come un archivio dati permanente.
Il parametro
stronglyBound
è stato dichiarato obsoleto e non deve essere impostato su
true
. L'impostazione di questo parametro su
true
non garantisce una protezione supplementare dei dati. Allo stesso tempo, l'accesso ai dati diventa impossibile dopo un aggiornamento dell'applicazione, anche se l'ID editore rimane lo stesso.
Le prestazioni dell'archivio locale crittografato potrebbero risultare ridotte se la dimensione dei dati memorizzati supera 10 MB.
Quando si disinstalla un'applicazione AIR, il programma di disinstallazione non elimina i dati memorizzati nell'archivio locale crittografato.
Procedure ottimali
Per l'uso dell'archivio ELS sono consigliate le seguenti modalità:
-
Utilizzate l'archivio ELS per memorizzare dati utente sensibili come password (impostando stronglyBound su false)
-
Non utilizzate l'archivio ELS per memorizzare dati riservati delle applicazioni come chiavi DRM o token di licenza.
-
Prevedete un modo in cui l'applicazione possa ricostituire i dati dell'archivio ELS in caso di perdita di tali dati. Ad esempio, potreste richiedere all'utente di reinserire le credenziali dell'account in caso di necessità.
-
Non utilizzate il parametro
stronglyBound
.
-
Se invece decidete di impostare
stronglyBound
su
true
, non eseguite la migrazione dei dati archiviati durante un aggiornamento. Ricostituite invece i dati dopo l'aggiornamento.
-
Archiviate solo quantità relativamente piccole di dati. Per quantità di dati più grandi, utilizzare un database SQL AIR con crittografia.
Aggiunta di dati all'archivio locale crittografato
Utilizzare il metodo
setItem()
statico della classe EncryptedLocalStore per memorizzare dati nell'archivio locale. I dati sono memorizzati in una tabella hash. Le stringhe vengono utilizzate come chiavi e i dati sono memorizzati come array di byte.
Ad esempio, il codice seguente memorizza una stringa nell'archivio locale crittografato:
var str:String = "Bob";
var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(str);
EncryptedLocalStore.setItem("firstName", bytes);
Il terzo parametro del metodo
setItem()
, il parametro
stronglyBound
è opzionale. Se questo parametro è impostato su
true
, l'archivio locale crittografato associa l'elemento memorizzato alla firma digitale e ai bit dell'applicazione AIR di memorizzazione:
var str:String = "Bob";
var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(str);
EncryptedLocalStore.setItem("firstName", bytes, false);
Per un elemento memorizzato con
stronglyBound
impostato su
true
, le chiamate successive a
getItem()
vengono eseguite correttamente solo se l'applicazione AIR chiamante è identica all'applicazione di memorizzazione (se non sono stati modificati dati nella directory dell'applicazione). Se l'applicazione AIR chiamante è diversa dall'applicazione di memorizzazione, viene generata un'eccezione Error quando chiamate
getItem()
per un elemento con un'associazione forte. Se aggiornate l'applicazione, questa non sarà più in grado di leggere i dati con associazione forte che erano stati scritti in precedenza nell'archivio locale crittografato. Se impostate
stronglyBound
su
true
su dispositivi mobili, l'impostazione viene ignorata; il parametro viene infatti sempre considerato
false
.
Se il parametro
stronglyBound
è impostato su
false
(impostazione predefinita), solo l'ID dell'editore deve rimanere lo stesso per consentire all'applicazione di leggere i dati. Le porzioni dell'applicazione possono cambiare (e devono essere firmate dall'editore), ma non devono essere necessariamente le stesse porzioni dell'applicazione che ha memorizzato i dati. Le applicazioni aggiornate con lo stesso ID editore dell'originale possono continuare ad accedere ai dati.
Nota:
in pratica, l'impostazione di
stronglyBound
su
true
non aggiunge protezione dati supplementare. Un utente “malintenzionato” può ancora modificare un'applicazione per ottenere l'accesso agli elementi memorizzati nell'ELS. Inoltre, i dati sono protetti da minacce non utente esterne in maniera altrettanto solida a prescindere dal fatto che
stronglyBound
sia impostato su
true
o
false
. Per questi motivi, si consiglia di non impostare
stronglyBound
su
true
.