【问题标题】:How do I read/write an Encrypted XML file using LINQ to XML?如何使用 LINQ to XML 读/写加密的 XML 文件?
【发布时间】:2010-09-21 00:20:08
【问题描述】:

我想使用 LINQ to XML 读取/写入加密的 XML 文件。有谁知道如何使用 .NET Framework 内置的加密算法来加密 XDocument 对象使用的 Stream?

我确实尝试过,但您无法将 CryptoStream 设置为读/写访问。它只支持读取或写入,这会导致 LINQ to XML 抛出异常。

更新:“即时”读取/写入文档会很好,但我只需要读取加密的 xml 文件,对其进行操作,然后将其重新加密写回。

【问题讨论】:

  • 你能说明你想做什么吗?将整个文档读入内存,对其进行操作,然后再次写出就足够了——还是您需要能够即时读/写?

标签: .net xml linq encryption linq-to-xml


【解决方案1】:

最简单的方法可能是 XDocument.Load()、Linq,然后是 XDocument.Save()。从一个快速测试应用程序(轻松使用非处置资源):

XDocument writeContacts = new XDocument(
   new XElement("contacts",
      new XElement("contact",
         new XElement("name", "Patrick Hines"),
         new XElement("phone", "206-555-0144",
             new XAttribute("type", "home")),
         new XElement("phone", "425-555-0145",
             new XAttribute("type", "work")),
         new XElement("address",
            new XElement("street1", "123 Main St"),
            new XElement("city", "Mercer Island"),
            new XElement("state", "WA"),
            new XElement("postal", "68042")
         )
      )
   )
);

Rijndael RijndaelAlg = Rijndael.Create();

FileStream writeStream = File.Open("data.xml", FileMode.Create);
CryptoStream cStream = new CryptoStream(writeStream,
    RijndaelAlg.CreateEncryptor(RijndaelAlg.Key, RijndaelAlg.IV),
    CryptoStreamMode.Write);

StreamWriter writer = new StreamWriter(cStream);

writeContacts.Save(writer);

writer.Flush();
writer.Close();

FileStream readStream = File.OpenRead("data.xml");

cStream = new CryptoStream(readStream,
  RijndaelAlg.CreateDecryptor(RijndaelAlg.Key, RijndaelAlg.IV),
  CryptoStreamMode.Read);

XmlTextReader reader = new XmlTextReader(cStream);

XDocument readContacts = XDocument.Load(reader);

//manipulate with Linq and Save() when needed

将您最喜欢的 ICryptoTransform 换成 CryptoStream。

【讨论】:

  • 我尝试使用 AesManaged 类进行加密,但由于它想要对流进行读/写访问而出错。嗯...我会再试一次。谢谢。
  • @Chris - 这取决于应用程序。有时您根本不需要存储它。也许您在运行时接受用户的密码并使用Rfc2898DeriveBytes 生成密钥。在其他情况下,您将密码存储在安全的配置位置。我的示例只是加密/解密过程的演示。您不想在实际应用中使用 Rijandael 生成的密钥,因为它是在每次实例化时生成的。
  • 这正是我正在寻找的,但我正在努力解决一点问题。如何将流保存到物理文件?我觉得这应该很容易,但我真的很挣扎。谢谢。
【解决方案2】:

[更新:向 Corbin March 致敬,他(在同一时间)写了同样的东西,但在代码中!]

大多数流一种方式。我想你必须:

  • 创建一个CryptoStream 读取(文件等)
  • 读取数据(例如到XDocument
  • 编写代码(阅读文档、进行更改等)
  • 创建一个新的CryptoStream 写入(文件等)[从相同的 IV 等开始)
  • 将文档保存到流中

根据底层流是什么(FileStreamMemoryStream 等),您可能还必须在读取和写入之间完全关闭/重新打开它(即 CryptoStream 可能会感觉到所有权基本流,并将.Close()它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多