【问题标题】:Write encrypted data to xml将加密数据写入xml
【发布时间】:2016-09-23 00:12:18
【问题描述】:

在我的应用程序中,我有以下代码用于将某些数据加密为字符串:

private string EncryptPermission(User user)
{
    Encoding encoding = Encoding.ASCII;
    Cryptography cryptography = CreateCryptography(user);
    byte[] val = encoding.GetBytes(user.Permission.ToString());
    byte[] encrypted = cryptography.Encrypt(val);
    string result = encoding.GetString(encrypted);
    return result;
}

这就像我想要的那样。现在我想将该数据写入一个 xml 文件,例如:

internal void WriteUser(User user)
{
    XElement userElement = new XElement("user",
        new XAttribute("id", user.UserId.ToString("N")),
        new XElement("name", user.Username),
        new XElement("password", user.Password),
        new XElement("permission", EncryptPermission(user)));

    XDocument document = GetDocument();
    if (document.Root != null)
    {
        document.Root.Add(userElement);
        SaveDocument(document);
    }
}

目前我打电话给SaveDocument 我得到一个Exception 喜欢:

发生“System.ArgumentException”类型的第一次机会异常 在 System.Xml.dll 中

附加信息:'',十六进制值0x06,是一个 无效字符。

(从德语翻译)

我该如何解决这个问题?我已经尝试过使用Converter.ToBase64String(..)Converter.FromBase64String(..),但是我得到了一个例外,即数据太长。

【问题讨论】:

标签: c# xml encryption


【解决方案1】:

加密产生字节,并非所有字节都是有效字符,正如 XML 所期望的那样。您的 0x06 就是其中之一。一种可能的解决方案是在写入 XML 之前将字节转换为 Base64。 Base64 仅使用有效字符,但会增加一些大小:它使用四个字符写入三个字节。

查看 C# Base64 转换方法的 Convert 类。

【讨论】:

    【解决方案2】:

    它很可能归结为字符串中的一个字符,破坏了 xml。

    在节点内的 CDATA[] 标签中添加加密字符串,你应该没问题

    What does <![CDATA[]]> in XML mean?

    【讨论】:

    • 您不能将二进制数据转储到 cdata 部分,例如 0x0 是不合法的。
    • 我想,如果它是一个加密字符串。使用 CDATA 就可以了。我的错。
    • msdn 上的一个页面显示,你是怎么做到的:msdn.microsoft.com/en-us/library/sb7w85t6(v=vs.110).aspx
    猜你喜欢
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多