Article d’origine publié le dimanche 3 juillet 2011

L’autre jour, je travaillai sur la version Mango de Windows Phone 7. L’une des fonctionnalités intéressantes (il y en a beaucoup) qui ont été ajoutées est la prise en charge de DPAPI. Vous pouvez vous en servir pour chiffrer du contenu avant de le stocker localement. Dans WP7, lorsqu’une application stocke des données localement, elle utilise le système IsolatedStorage qui comprend des classes permettant à vos applications de lire et d’écrire dans le stockage. Mais, j’ai découvert (du moins à ce stade) que cela ne fonctionne fondamentalement pas avec du contenu chiffré par DPAPI. Je vais vous expliquer ce que j’entends par là.

Supposons que vous utilisiez DPAPI pour chiffrer du contenu avant de l’écrire sur disque. Maintenant, vous souhaitez lire ces données chiffrées, puis les déchiffrer pour les utiliser. Si vous suivez la plupart des exemples IsolatedStorage, vous procèderez d’une façon similaire à la suivante :

//accéder au stockage isolé pour les informations d’identification
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
 //accéder au fichier d’inscription
 using (var stream = new
  IsolatedStorageFileStream(REG_INFO_FILE, FileMode.Open, FileAccess.Read, store))
 {
  //lire le contenu dans une variable
  using (var reader = new StreamReader(stream))
  {
   //créer et remplir le tableau d’octets avec les données brutes pour les utiliser
   byte[] rawData = new byte[reader.Length];
   reader.Read(rawData, 0, Convert.ToInt16(byteStream.Length));

   //déchiffrer les données
   byte[] safeData = ProtectedData.Unprotect(rawData, null);
  }
 }
}

Mais il y a un problème lorsque vous appelez Unprotect ; vous obtenez une erreur parmi les lignes de remplissage ajoutées. En effet, le lecteur IsolatedStorageFileStream par défaut ajoute des caractères supplémentaires lorsqu’il lit le contenu. Pour contourner ce problème, vous devez obtenir une référence du flux sous-jacent et lire directement à partir de celui-ci. Par exemple, le code suivant :

//créer et remplir le tableau d’octets avec les données brutes pour les utiliser
byte[] rawData = new byte[reader.Length];
reader.Read(rawData, 0, Convert.ToInt16(byteStream.Length));

Doit être remplacé par :

Stream byteStream = reader.BaseStream;                               

//créer et remplir le tableau d’octets avec les données brutes pour les utiliser
byte[] rawData = new byte[byteStream.Length];
byteStream.Read(rawData, 0, Convert.ToInt16(byteStream.Length));

//déchiffrer les données
byte[] safeData = ProtectedData.Unprotect(rawData, null);

À partir du moment où vous utilisez BaseStreamn, cela devrait résoudre les erreurs de remplissage.

 

Ce billet de blog a été traduit de l’anglais. Vous trouverez la version originale ici : Using DPAPI with IsolatedStorage In Windows Phone 7 Mango Release