65.9K
CodeProject 正在变化。 阅读更多。
Home

加密和解密 DataSet 到 XML 文件

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.54/5 (23投票s)

2005年4月16日

2分钟阅读

viewsIcon

112812

downloadIcon

2573

此类库允许将数据集加密为 XML 文件并读取回它们。包含一个 Win 窗体应用程序作为展示。

引言

XML 是一种简单易用的、便携式的方法,用于在 .NET Framework 中保存DataSet。所有处理 XML 的方法都包含在 .NET 中,因此最终用户无需专有的数据处理软件或服务器即可读取数据。

我最近需要能够保存加密的DataSet来跟踪学生的学习进度。显然,XML 格式过于容易访问,无法保存此类需要防止篡改的信息,因此我需要加密,而加密是 .NET 的标准配置。但是,我仍然面临一些挑战

  1. 我希望能够只通过对特殊的“加密”类库进行几次调用来完成所有加密和解密操作。
  2. 虽然在 .NET 中解密文件非常容易,但我希望在过程中避免将未加密的临时文件写入磁盘。
  3. 每个 XML 文件的开头都非常标准,因此它可能被用来“猜测”加密密钥并破解代码。
  4. 最后,我需要一种机制来识别加密文件,以便DataSet不会加载错误数据。

我着手开发一个类库 (XMLEncryptor) 来使用用户名和密码加密和解密DataSet。上述挑战的处理方法如下:

XMLEncryptor 类使用两个字符串(用户名和密码)进行实例化。构造函数创建加密密钥和初始化向量,以及一个 16 字节的签名。

签名作为文件头写入,不进行加密,XMLEncryptor 使用它来识别使用其方法加密的文件。此外,签名还用作掩码,用于将标准 XML 头推送到文件中的第 17 个字节,这应该提供一定程度的保护,防止“猜测”XML 头(参见上面的 3)。

XMLEncryptor 公开两个公共函数,一个用于读取加密的 XML 文件,另一个用于将DataSet写回文件。

  • public DataSet ReadEncryptedXML(string fileName)
  • public void WriteEncryptedXML(DataSet dataset, string encFileName)

如果一切按预期进行,ReadEncryptedXML 函数将返回一个DataSet。加密的 XML 数据将解密到MemoryStream中,随后用于加载DataSet,然后可以将其返回给调用方,而无需将中间文件写入磁盘。如果在读取、解密等过程中遇到错误,ReadEncryptedXML 函数将返回null

WriteEncryptedXML 函数获取DataSet并使用与解密相同的加密密钥和 IV 将其写入文件。同样,也不涉及临时文件。

XMLEncryptor 的典型用法如下:

{
   XMLEncryptor XMLenc = new XMLEncryptor("myname", "mypassword");
   // Load encrypted file into DataSet
   DataSet myDataSet = XMLenc.ReadEncryptedXML("myfile.enc");
   // test for successful read
   if (myDataSet == null)
   {
      // Do something
      return;
   }
   // write back the dataset
   XMLEnc.WriteEncryptedXML(myDataSet, "myfile.enc");
}

应用程序的局限性:

  1. 用户名和密码的处理留给父应用程序。
  2. 无法处理大于 2 GB 的文件。但是,由于该过程涉及数据的内存处理,实际大小限制可能更小。

就是这样!

享受。

© . All rights reserved.