Utilizzo di DPAPI con IsolatedStorage in Windows Phone 7 Mango
Articolo originale pubblicato domenica 3 luglio 2011
Ho effettuato alcune operazioni con la versione Mango di Windows Phone 7 alcuni giorni fa. Una delle importanti e numerose funzionalità che sono state aggiunte è il supporto per DPAPI. Questa funzionalità può essere utile per la crittografia di contenuto prima dell'archiviazione in locale. Quando in WP7 un'applicazione archivia dati in locale, viene utilizzato il sistema IsolatedStorage, in cui sono disponibili alcune classi che consentono alle applicazioni di leggere e scrivere informazioni. Ho scoperto tuttavia (almeno a questo punto) che questo sistema non funziona con il contenuto crittografato con DPAPI. Fornirò di seguito maggiori dettagli.
Si supponga che sia stata utilizzata l'interfaccia DPAPI per crittografare alcuni dati prima della scrittura su disco. Si desidera ora leggere i dati crittografati, decrittografarli e utilizzarli. Se si segue la maggior parte degli esempi di IsolatedStorage, verranno effettuate le operazioni seguenti:
//get into isolated storage for the credentials
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
//stream in our registration file
using (var stream = new
IsolatedStorageFileStream(REG_INFO_FILE, FileMode.Open, FileAccess.Read, store))
{
//read the contents into a variable
using (var reader = new StreamReader(stream))
{
//create and fill the byte array with the raw data so you can use it
byte[] rawData = new byte[reader.Length];
reader.Read(rawData, 0, Convert.ToInt16(byteStream.Length));
//now decrypt it
byte[] safeData = ProtectedData.Unprotect(rawData, null);
}
}
}
Quando tuttavia si chiama Unprotect, viene visualizzato un errore sulle linee di riempimento aggiunte. Il problema è rappresentato da alcuni caratteri aggiuntivi che vengono inseriti dall'agente di lettura IsolatedStorageFileStream predefinito quando legge automaticamente il contenuto. Per risolvere questo problema, è necessario ottenere un riferimento al flusso sottostante e leggere direttamente da esso. Ad esempio, il codice seguente:
//create and fill the byte array with the raw data so you can use it
byte[] rawData = new byte[reader.Length];
reader.Read(rawData, 0, Convert.ToInt16(byteStream.Length));
Deve essere sostituito con:
Stream byteStream = reader.BaseStream;
//create and fill the byte array with the raw data so you can use it
byte[] rawData = new byte[byteStream.Length];
byteStream.Read(rawData, 0, Convert.ToInt16(byteStream.Length));
//now decrypt it
byte[] safeData = ProtectedData.Unprotect(rawData, null);
L'utilizzo di BaseStream dovrebbe consentire di risolvere eventuali errori di riempimenti.
Questo è un post di blog localizzato. L'articolo originale è disponibile in Using DPAPI with IsolatedStorage In Windows Phone 7 Mango Release.