Stockage local chiffré

Le moteur d’exécution d’Adobe® AIR® propose un magasin local chiffré (ELS, acronyme d’Encrypted Local Store) persistant par application AIR installée sur l’ordinateur d’un utilisateur. Vous pouvez ainsi enregistrer et extraire les données stockées sur le disque dur local de l’utilisateur dans un format chiffré qui ne peut pas être aisément déchiffré par d’autres utilisateurs. A chaque application AIR correspond un magasin local chiffré distinct et chacune d’elle utilise un magasin local chiffré par utilisateur.

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.

Pour associer le magasin local chiffré à chaque application et chaque utilisateur, AIR utilise DPAPI sous Windows, KeyChain sous Mac OS et KeyRing ou KWallet sous Linux. Le magasin local chiffré utilise le chiffrement AES-CBC 128 bits.

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é.

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é.

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();