加密和解密 DataSet 到 XML 文件






2.54/5 (23投票s)
2005年4月16日
2分钟阅读

112812

2573
此类库允许将数据集加密为 XML 文件并读取回它们。包含一个 Win 窗体应用程序作为展示。
引言
XML 是一种简单易用的、便携式的方法,用于在 .NET Framework 中保存DataSet
。所有处理 XML 的方法都包含在 .NET 中,因此最终用户无需专有的数据处理软件或服务器即可读取数据。
我最近需要能够保存加密的DataSet
来跟踪学生的学习进度。显然,XML 格式过于容易访问,无法保存此类需要防止篡改的信息,因此我需要加密,而加密是 .NET 的标准配置。但是,我仍然面临一些挑战
- 我希望能够只通过对特殊的“加密”类库进行几次调用来完成所有加密和解密操作。
- 虽然在 .NET 中解密文件非常容易,但我希望在过程中避免将未加密的临时文件写入磁盘。
- 每个 XML 文件的开头都非常标准,因此它可能被用来“猜测”加密密钥并破解代码。
- 最后,我需要一种机制来识别加密文件,以便
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");
}
应用程序的局限性:
- 用户名和密码的处理留给父应用程序。
- 无法处理大于 2 GB 的文件。但是,由于该过程涉及数据的内存处理,实际大小限制可能更小。
就是这样!
享受。