xml - 将 AES 加密字节和 IV 存储到 XML 的最佳方法?

标签 xml linq c#-4.0 encoding cryptography

我对编码和密码学都不熟悉,所以我问的问题可能太基础了。我需要对提供给我的值进行加密,并将加密后的值以及用于加密的 IV 存储在文档中。加密是使用存储在别处的主 key 完成的。我使用 AES 加密,加密代码如下所示:

 private EncryptedData EncryptValue(string value, byte[] encryptedMasterKey)
        {
            byte[] encryptedValue = new byte[0];
            AesCryptoServiceProvider aesCryptoServiceProvider = null;

            //decrypt the master key
            encryptedMasterKey = DecryptMasterKey(encryptedMasterKey);

            // Create an AesCryptoServiceProvider object
            // with the specified key and IV.                   
            using (aesCryptoServiceProvider = new AesCryptoServiceProvider())
            {
                aesCryptoServiceProvider.Key = encryptedMasterKey;

                // Create an encryptor to perform the stream transform.
                ICryptoTransform encryptor = aesCryptoServiceProvider.CreateEncryptor(
                    aesCryptoServiceProvider.Key, aesCryptoServiceProvider.IV);

                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            //Write all data to the stream.
                            swEncrypt.Write(value);
                        }
                        encryptedValue = msEncrypt.ToArray();
                    }
                }
            }

            EncryptedData encryptedData = new EncryptedData(encryptedValue, aesCryptoServiceProvider.IV);
            return encryptedData;
        }

将数据写入 XML 的代码如下所示:

public void WriteData(string id, EncryptedData encryptedData)
    {

        XDocument document = GetValidDocument();
        XElement[] encryptedDataElements = null;
        XElement encryptedDataElement;
        encryptedDataElements = (from element in document.Descendants(EncryptedDataElementName)
                                 where element.Element(IdElementName).Value.ToUpper() == id.ToUpper()
                                 select element).ToArray();
        if (encryptedDataElements.Count() != 0)
        {
            encryptedDataElement = encryptedDataElements.First();
            encryptedDataElement.Remove();
        }
        encryptedDataElement = new XElement(EncryptedDataElementName);
        XElement idElement = new XElement(IdElementName, id);
        encryptedDataElement.Add(idElement);
        XElement encryptedValueElement = new XElement(EncryptedValueElementName);
        encryptedValueElement.SetValue(Encoding.UTF8.GetString(encryptedData.EncryptedValue));
        XElement saltElement = new XElement(SaltElementName, Encoding.UTF8.GetString(encryptedData.Salt));
        encryptedDataElement.Add(encryptedValueElement);
        encryptedDataElement.Add(saltElement);
        document.Element(StoreElementName).Add(encryptedDataElement);
        IXmlService xmlService = GlueRegistry.Instance.GetService<IXmlService>();
        xmlService.SaveXmlDocument(document, filePath);
    }

我认为最好保存为 UTF8 编码的字符串并将值取回为 UTF8 编码的字节数组。序列化不是一种选择,因为数据是一个一个地写入的。问题出在带有 Encoding.UTF8.GetString 的 SetValue 方法中。我也明白我应该使用 XElement.Parse。我使用了它,但出现异常,提示该值无效。我现在想知道 UTF8 是否是一个不错的选择,或者是否有另一种更好的方法来完成我正在尝试做的事情。

在此先感谢您的帮助!

最佳答案

  1. 对于编码,我推荐使用 Base64。 Utf8 旨在将文本转换为字节。它不能将任意二进制数据转换为文本。
  2. 我建议使用经过身份验证的加密/添加 MAC。未经身份验证的加密会招致主动攻击,例如填充预言机。

所以你的代码变成这样:

byte[] ciphertext = iv + Encrypt(key, m);
byte[] ciphertextWithMAC = ciphertext + HMAC(key, ciphertext)
string encodedCiphertext = Base64Encode(cipherText)

关于xml - 将 AES 加密字节和 IV 存储到 XML 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14499778/

相关文章:

python - 将 kickstart 文件传递​​给虚拟管理器 xml 文件

xml - 使用 XSL 合并 XML 文件会删除匹配的元素

c# - LambdaExpression 为覆盖的属性获取不正确的 DeclaringType

c# - 使用一个模型发送两个 LINQ 查询以查看

c# - 如何检查用户是否属于某个广告组?

c# - 从 jquery ajax 调用 webmethod 和静态对象的问题

unity-game-engine - 在 Unity 中使用 API 创建购物车

java - 如何判断 XML 文档是否针对 DTD 或 XSD 进行验证?

xml - 如何复制一个元素(文本字符串)的内容并附加到另一个元素的内容? (XML)

c# - 如何使用 Linq 获取 IGrouping 索引到实体? (不支持异常)