Verwenden von DPAPI mit "IsolatedStorage" in der Windows Phone 7-Version "Mango"

Veröffentlichung des Originalartikels: 03.07.2011

Vor kurzem habe ich mich mit der Version "Mango" von Windows Phone 7 (WP7) beschäftigt. Eine der tollen neuen Funktionen (von denen es viele gibt) ist die Unterstützung für DPAPI. Eine der Anwendungsmöglichkeit hierfür ist die Verschlüsselung bestimmter Inhalte, ehe sie lokal gespeichert werden. In WP7 nutzt eine Anwendung, wenn sie Daten lokal speichert, das IsolatedStorage-System. Dieses System bietet verschiedene hilfreiche Klassen für die Lese- und Schreibvorgänge Ihrer Anwendungen. Doch eine Sache, die ich (bislang) herausgefunden habe, ist, dass dies bei mit DPAPI verschlüsselten Inhalten nicht funktioniert. Ich möchte Ihnen nun erklären, was ich damit meine.

Angenommen, Sie nutzen DPAPI zum Verschlüsseln von Inhalten, die anschließend auf den Datenträger geschrieben werden. Nun wollen Sie diese verschlüsselten Daten wieder einlesen, sie entschlüsseln und damit arbeiten. Wenn Sie dabei den meisten Beispielen für IsolatedStorage folgen, gehen Sie wohl ungefähr so vor:

//Isolierten Speicher für die Anmeldeinformationen abrufen
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
 //Datenstrom in unserer Registrierungsdatei
 using (var stream = new
  IsolatedStorageFileStream(REG_INFO_FILE, FileMode.Open, FileAccess.Read, store))
 {
  //Den Inhalt in eine Variable einlesen
  using (var reader = new StreamReader(stream))
  {
   //Das Bytearray erstellen und mit den Rohdaten füllen, damit Sie es verwenden können
   byte[] rawData = new byte[reader.Length];
   reader.Read(rawData, 0, Convert.ToInt16(byteStream.Length));

   //Nun die Daten entschlüsseln
   byte[] safeData = ProtectedData.Unprotect(rawData, null);
  }
 }
}

Das Problem ist, dass Sie beim Aufrufen von Unprotect eine Fehlermeldung zusammen mit den auffüllenden Zeilen erhalten, die hinzugefügt wurden. Das Problem sind einige Zusatzzeichen, die der standardmäßige IsolatedStorageFileStream-Leser hinzufügt, wenn dieser den Inhalt für Sie einliest. Zum Umgehen dieses Problems müssen einen Verweis auf den zugrunde liegenden Datenstrom abrufen und diesen direkt einlesen. Dieser Code beispielsweise:

//Das Bytearray erstellen und mit den Rohdaten füllen, damit Sie es verwenden können
byte[] rawData = new byte[reader.Length];
reader.Read(rawData, 0, Convert.ToInt16(byteStream.Length));

muss geändert werden in:

Stream byteStream = reader.BaseStream;                               

//Das Bytearray erstellen und mit den Rohdaten füllen, damit Sie es verwenden können
byte[] rawData = new byte[byteStream.Length];
byteStream.Read(rawData, 0, Convert.ToInt16(byteStream.Length));

//Nun die Daten entschlüsseln
byte[] safeData = ProtectedData.Unprotect(rawData, null);

Sobald Sie mit dem BaseStream-Objekt arbeiten, sollten keine Auffüllfehler mehr auftreten.

 

Es handelt sich hierbei um einen übersetzten Blogbeitrag. Sie finden den Originalartikel unter Using DPAPI with IsolatedStorage In Windows Phone 7 Mango Release