【问题标题】:What is the proper way to encrypt an XmlTextWriter and serialize it to a file?加密 XmlTextWriter 并将其序列化为文件的正确方法是什么?
【发布时间】:2012-07-30 15:15:31
【问题描述】:

我有一个 XmlTextWriter,它使用如下所示的 XmlSerializer 写入文件:

using (XmlTextWriter writer = new XmlTextWriter(path, null))
{
   writer.Formatting = Formatting.Indented;
   writer.Indentation = 3;
   MyFileObj.ourSerializer.Serialize(writer, xmlFile, ourXmlNamespaces);
}

其中“ourSerializer”只是对 System.Xml.Serialization.XmlSerializer 对象的引用。但是,我有一个实例,必须将此 XML 加密到磁盘,以便最终用户无法读取其内容,并且我不确定使用现有代码的正确方法,因为有很多地方调用此代码并且不需要加密。任何人都可以为我提供一些见解吗?

【问题讨论】:

  • 仅供参考,您不应该使用new XmlTextWriter()。自 .NET 2.0 以来,它已被弃用。你应该改用XmlWriter.Create()。
  • 这是我们代码中多年未触及的部分。我不知道它已被弃用,但感谢您提供的信息,这是我必须在不久的将来更改的内容。

标签: c# .net xml encryption .net-4.0


【解决方案1】:

另一种方法是使用 CryptoStream,如下所示:

using (var fs = new FileStream(path, System.IO.FileMode.Create))
{
    using (var cs = new CryptoStream(fs, _Provider.CreateEncryptor(), CryptoStreamMode.Write))
    {
        using (var writer = XmlWriter.Create(cs))
        {

            writer.Formatting = Formatting.Indented;
            writer.Indentation = 3;
            MyFileObj.ourSerializer.Serialize(writer, xmlFile, ourXmlNamespaces);
        }
    }
}

其中 _Provider 是正确初始化的 AesCryptoServiceProvider。

【讨论】:

  • -1 表示 try/catch 块。另外,出于个人喜好,我不希望使用返回 IDisposible 的方法,而是内联并包含 using 语句。
  • +1。剩下的唯一问题是你应该说XmlReader.Create,而不是XmlTextReader.Create。 Create 是 static 类的 static 方法。
  • per:msdn.microsoft.com/en-us/library/kkz7cs0d(v=vs.100).aspx 关于为什么应该使用 XmlWriter,以防万一有人感兴趣。
【解决方案2】:

这是我最终解决问题的方法:

MemoryStream ms = new MemoryStream();
XmlSerializer ourSerializer.Serialize(ms, xmlFile, ourXmlNamespaces);
ms.Position = 0;
//Encrypt the memorystream
using (TextReader reader = new StreamReader(ms, Encoding.ASCII))
using (StreamWriter writer = new StreamWriter(path))
{
   string towrite = Encrypt(reader.ReadToEnd());
   writer.Write(towrite);
}

基本上将 XML 序列化为 MemoryStream,将文本读回 TextReader,加密 TextReader 内容,然后将生成的加密字符串保存到文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    相关资源
    最近更新 更多