Stockage local chiffré

La classe EncryptedLocalStore (ELS) fournit un mécanisme de stockage local chiffré que vous pouvez utiliser comme mémoire cache pour stocker les données privées d’une application. Les données du magasin local chiffré ne peuvent pas être partagées entre les applications. L’objectif du magasin local chiffré est de permettre à une application de stocker les éléments facilement recréés tels que les informations d’identification et autres informations privées. Les données du magasin local chiffré ne doivent pas être considérées comme étant permanentes, comme nous l’indiquons dans les rubriques « Restrictions du magasin local chiffré » et « Recommandations d’utilisation » ci-dessous.

Remarque : outre le magasin local chiffré, AIR assure également le chiffrement du contenu stocké dans les bases de données SQL. Pour plus d’informations, voir la section Utilisation du chiffrement avec les bases de données SQL.

Vous pouvez utiliser le magasin local chiffré pour placer en mémoire cache les informations à sécuriser, telles que les informations d’identification de connexion aux services Web. Le magasin local chiffré est adapté au stockage d’informations confidentielles. Il ne protège toutefois pas les données des autres processus exécutés à l’aide du même compte utilisateur. Il n’est par conséquent pas adapté à la protection des données d’applications confidentielles telles que DRM ou les clés de chiffrement.

Sur les plates-formes de bureau, AIR utilise DPAPI sous Windows, KeyChain sous Mac OS et iOS, et KeyRing ou KWallet sous Linux pour associer le magasin local chiffré à chaque application et chaque utilisateur. Le magasin local chiffré utilise le chiffrement AES-CBC 128 bits.

Sur Android, les données enregistrées par la classe EncryptedLocalStorage ne sont pas chiffrées. Elles sont protégées par la sécurité de niveau utilisateur fournie par le système d’exploitation. Le système d’exploitation Android affecte à chaque application un ID utilisateur distinct. Les applications peuvent uniquement accéder à leurs propres fichiers et aux fichiers créés dans des emplacements publics (tels que la carte de stockage amovible). Notez que sur les périphériques Android associés à une racine, les applications s’exécutant avec des privilèges racines PEUVENT accéder aux fichiers d’autres applications. Sur ce type de périphérique, le magasin de stockage local ne fournit pas un niveau élevé de protection de données.

Les informations stockées dans le magasin local chiffré sont réservées au contenu d’application AIR dans le sandbox de sécurité de l’application.

Une version mise à jour d’une application AIR conserve un accès à toute donnée existante stockée dans le magasin local chiffré, sauf si :

  • Lors de l’ajout des éléments, le paramètre stronglyBound était défini sur true.

  • La version existante et la version mise à jour sont toutes deux publiées avant AIR 1.5.3 et la mise à jour est dotée d’une signature de migration.

Restrictions du magasin local chiffré

Les données stockées dans le magasin local chiffré sont protégées par les informations d’identification du compte sur le système d’exploitation de l’utilisateur. Sauf s’il se connecte sous le nom de cet utilisateur, aucun autre utilisateur ne peut accéder aux données du magasin. Les données ne sont toutefois pas protégées contre les accès par d’autres applications exécutées par un utilisateur authentifié.

Puisque l’utilisateur doit être authentifié pour que ces attaques aboutissent, les données privées de ce dernier demeurent protégées, à moins que le compte utilisateur en tant que tel ne soit plus sécurisé. Toutefois, les données que votre application ne souhaite pas partager avec d’autres utilisateurs, telles que les clés d’obtention de licence ou de gestion des droits numériques, ne sont pas sécurisées. L’ESL n’est donc pas adapté au stockage d’informations de ce type. Il convient uniquement au stockage des données privées d’un utilisateur, telles que les mots de passe.

Les données stockées dans l’ELS risquent d’être perdues pour diverses raisons. L’utilisateur pourrait par exemple désinstaller l’application et supprimer le fichier chiffré. L’identifiant d’éditeur pourrait également être modifié suite à une mise à jour. L’ELS doit de ce fait être traité comme une mémoire cache privée et non un emplacement de stockage de données permanent.

L’utilisation du paramètre stronglyBound étant déconseillée, ne le définissez pas sur true. Définir ce paramètre sur true ne constitue pas une mesure de protection complémentaire des données. L’accès aux données est par ailleurs perdu lorsque l’application est mise à jour, même si l’identifiant d’éditeur ne change pas.

Les performances du magasin local chiffré risquent d’être plus lentes si les données stockées dépassent 10 Mo.

Lorsque vous désinstallez une application AIR, le programme de désinstallation ne supprime pas les données stockées dans le magasin local chiffré.

Recommandations d’utilisation

Les recommandations d’utilisation de l’ELS sont les suivantes :

  • Stockez dans l’ELS les données utilisateur confidentielles telles que les mots de passe (définissez le paramètre stronglyBound sur false).

  • Ne stockez pas dans l’ELS des données secrètes d’applications telles que les clés DRM ou les jetons de licence..

  • Intégrez dans l’application une technique de recréation des données stockées dans l’ELS en cas de perte des données stockées dans ce dernier. Vous pouvez, par exemple, inviter l’utilisateur à saisir à nouveau les informations d’identification du compte si besoin est.

  • N’utilisez pas le paramètre stronglyBound.

  • Si vous définissez stronglyBound sur true, n’effectuez pas la migration des éléments stockés lors d’une mise à jour. Créez à nouveau les données une fois la mise à jour terminée.

  • Ne stockez que des volumes relativement faibles de données. Stockez les volumes plus importants de données dans une base de données SQL AIR avec chiffrement.

Ajout de données au magasin local chiffré

La méthode statique setItem() de la classe EncryptedLocalStore permet de stocker des données dans le magasin local. Les données sont stockées dans une table de hachage, dans laquelle les chaînes font office de clés et les données stockées de tableaux d’octets.

Par exemple, le code suivant stocke une chaîne dans le magasin local chiffré :

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes);

Le troisième paramètre de la méthode setItem(), stronglyBound, est facultatif. Si ce paramètre est défini sur true, le magasin local chiffré lie l’élément stocké aux bits et à la signature numérique de l’application AIR qui effectue le stockage :

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes, false); 

Si un élément est stocké alors que stronglyBound est défini sur true, les appels suivants de getItem() n’aboutissent que si l’application AIR à l’origine de l’appel est identique à l’application qui effectue le stockage (en d’autres termes, si aucune donnée des fichiers résidant dans le répertoire de l’application n’a été modifiée). Si l’application AIR à l’origine de l’appel n’est pas identique à l’application de stockage, une exception Error est renvoyée lorsque vous appelez getItem() pour un élément à liaison forte. Si vous mettez à jour votre application, elle n’est plus en mesure de lire les données à liaison forte précédemment écrites dans le magasin local chiffré. La définition de stronglyBound sur true sur les périphériques mobiles est ignorée ; ce paramètre est toujours considéré comme false.

Si le paramètre stronglyBound est défini sur false (valeur par défaut), il suffit que l’identifiant d’éditeur reste identique pour que l’application puisse lire les données. Les bits de l’application peuvent changer (sous réserve d’être signés par le même éditeur), mais ne doivent pas nécessairement correspondre exactement aux bits de l’application qui a stocké les données. Les applications mises à jour dotées du même identifiant d’éditeur que l’application originale continuent à accéder aux données.

Remarque : en pratique, définir stronglyBound sur true n’assure aucune protection complémentaire des données. Un utilisateur « malveillant » pourrait en effet modifier une application en vue d’accéder aux éléments stockés dans l’ELS. Que stronglyBound soit défini sur true ou false, les données sont par ailleurs aussi bien protégées contre les menaces externes émanant de personnes autres que les utilisateurs. De ce fait, il est déconseillé de définir stronglyBoundsur true.

Accès aux données stockées dans le magasin local chiffré

Pour extraire une valeur du magasin local chiffré, utilisez la méthode EncryptedLocalStore.getItem(), comme dans l’exemple suivant :

var storedValue:ByteArray = EncryptedLocalStore.getItem("firstName"); 
trace(storedValue.readUTFBytes(storedValue.length)); // "Bob" 

Suppression de données du magasin local chiffré

Pour supprimer une valeur du magasin local chiffré, utilisez la méthode EncryptedLocalStore.removeItem(), comme dans l’exemple suivant :

EncryptedLocalStore.removeItem("firstName"); 

Pour supprimer toutes les valeurs du magasin local chiffré, appelez la méthode EncryptedLocalStore.reset(), comme dans l’exemple suivant :

EncryptedLocalStore.reset();