Sécurité : comment protéger des informations sensibles dans une application #Windows (#Phone) ?

Dans notre précédent article nous avons vu comment stocker des informations ayant une petite volumétrie (quelques ko) de façon sécurisée. Dans cet article, nous étudierons comment protéger des données. Il est alors possible de les stocker où bon nous semble !

 

Cryptage des données

Tout passe par la classe DataProtectionProvider de base qui vous permet de crypter et décrypter 2 types d’informations :

  • Un flux (stream) de données (mémoire, fichier, etc.)
  • un buffer de données (IBuffer facilement créé à partir d’un tableau de bytes)

 

Le fonctionnement est alors un grand classique des APIs WinRT :

// Ouverture du fichier
var storageFile = await StorageFile.GetFileFromApplicationUriAsync(logoUri);
var inputStream = await storageFile.OpenReadAsync();

// Création d'un fichier pour stocker la version cryptée
var outputFile = await KnownFolders.PicturesLibrary.CreateFileAsync("crypterLogo.data");
var outputStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite);

// Cryptage
var dataProtection = new DataProtectionProvider(protectionDescriptor);
await dataProtection.ProtectStreamAsync(inputStream, outputStream);

 

Vous remarquerez le paramètre “protectionDescriptor" utilisé pour instancier notre classe DataProtectionProvider ? Il s’agit (je cite MSDN) d’un descripteur de sécurité (SID) ou d’une chaîne SDDL (Security Descriptor Definition Language). En bref, cela décrit pour quelle “entité” vous allez chiffrer la donnée.

 

Quelques “descripteurs de protection” intéressants

Voici quelques valeurs intéressantes à utiliser dans vos applications. Il est aussi bon à savoir que si vous vous trompez en renseignant le descripteur, une exception sera levée lors de l’encryptage des données.

"LOCAL = user" :

Les données seront cryptées et accessibles pour l’utilisateur (par rapport à l’AD) courant . ATTENTION : une autre app, lancée par l’utilisateur courant, pourra elle-aussi décrypter les données.

N’importe quelle autre application pourra donc décrypter et lire vos données. Si vous laissez par exemple votre session ouverte, il est possible pour une personne malveillante de télécharger une app du Store pour prendre possession de vos données sensibles.

 

"LOCAL = machine" :

Les données seront cryptées et accessibles pour la machine courante. ATTENTION : une autre app, lancée par un autre utilisateur courant, pourra elle-aussi décrypter les données.

 

Chaines SID ou SDDL :

Les données seront cryptées et accessibles pour les utilisateurs définit par cette syntaxe. Cela peut par exemple être un groupe de l’AD.

Attention, pour activer cette fonctionnalité, il faut cocher la case “Entreprise Authentification” dans le fichier de manifest de votre application.

Une liste des SID les plus “connus” est disponible sur MSDN mais par exemple :

  • S-1-1-0 représente tous les utilisateurs
  • S-1-5-11 représente les utilisateurs connectés à la machine

 

Il est alors possible de combiner des règles en utilisant le normalisme SDDL défini lui aussi sur MSDN : http://msdn.microsoft.com/en-us/library/windows/desktop/dd981030(v=vs.85).aspx

Comment alors trouver le SID correspondant à l’application elle seule ? Cela permettrait notamment d’empêcher les autres applications/utilisateurs de décrypter vos données.

Cela devrait être possible car un compte est créé pour votre application. Vous pouvez notamment le subodorer en inspectant les informations de sécurité de votre dossier “Local” :

SecurityFolder

 

 

Par contre, je n’ai pas trouvé d’API permettant de retrouver cette information…

Décryptage des données

Pour cela, plus besoin de spécifier le descripteur utilisé, mais il faut au contraire utiliser obligatoirement le constructeur sans paramètre de la classe DataProtectionProvider.

// Ouverture de la version cryptée
var inputFile = await KnownFolders.PicturesLibrary.GetFileAsync("crypterLogo.data");
var inputStream = await inputFile.OpenAsync(FileAccessMode.ReadWrite);

// Création d'un fichier pour stocker la version decryptée
var outputFile = await KnownFolders.PicturesLibrary.CreateFileAsync("deCrypterLogo.png");
var outputStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite);

// deryptage
var dataProtection = new DataProtectionProvider();
await dataProtection.UnprotectStreamAsync(inputStream, outputStream);

await outputStream.FlushAsync();

 

Application Windows Phone Silverlight 8.0

Le système de DataProtectionProvider n’existe pas sur Windows Phone 8.0 mais il est possible de crypter des informations avec une clef unique disponible uniquement pour votre application.

 

Pour cela, il faut utiliser la méthode “Protect” de la classe “System.Security.Cryptography.ProtectedData” en lui donnant le tableau de bytes à crypter. Le décryptage fera quant à lui appel à la méthode Unprotect.

var initialData = Encoding.UTF8.GetBytes("Nous à Infinite Square");

var cryptedData = ProtectedData.Protect(initialData, null);

//Stockage des bytes

var decrypted = ProtectedData.Unprotect(cryptedData, null);

 

Dans un prochain article, nous aborderons les différentes méthodes de cryptage dans une app Windows (Phone) Store.

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus