다음을 통해 공유


通过 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 查看原文