通过 Windows Phone 7 Mango 版中的 IsolatedStorage 使用 DPAPI
原文发布于 2011 年 7 月 3 日(星期日)
前几天,我使用 Windows Phone 7 Mango 版本处理了一些工作。该版本新增了很多出色的功能,其中一项功能是支持 DPAPI。您可能需要使用该功能的一种情况是:在本地存储某些内容前对其进行加密。在 WP7 中,应用程序在本地存储数据时,它会使用 IsolatedStorage 系统。IsolatedStorage 系统有一些很实用的类,可以帮助应用程序读取和写入。我发现了这样一个问题(至少现在是这样),它基本上不能真正地处理由 DPAPI 加密的内容。下面,我来解释一下我这个说法。
假设,您使用 DPAPI 加密一些内容,然后将这些内容写入到磁盘。现在,您想读回这些加密的数据,将其解密,然后使用它执行一些操作。如果您参考大多数的 IsolatedStorage 示例,那么您应该使用以下代码:
//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);
}
}
}
这里的问题是,您在调用 Unprotect 时,会在已添加的填充行旁边显示错误。这里的问题是默认 IsolatedStorageFileStream 读取器在为您读取内容时额外添加的一些字符。要解决该问题,您需要获取一个对基础流的引用,并直接读取它。例如,下面的代码:
//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));
应更改为以下代码:
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);
在您开始使用 BaseStream 后,应该可以解决任何填充问题。
这是一篇本地化的博客文章。请访问 Using DPAPI with IsolatedStorage In Windows Phone 7 Mango Release 查看原文