繁体   English   中英

将对象序列化为byte [],然后加密byte []

[英]Serialize an Object to a byte[], then encrypting the byte[]

我遇到一种情况,我需要加密一个对象才能通过.NET Remoting连接发送该对象以进行传递。 我已经在代码中实现了字符串加密,因此我使用了类似的设计来加密对象:

public static byte[] Encrypt(object obj)
    {
        byte[] bytes = ToByteArray(toEncrypt); // code below
        using (SymmetricAlgorithm algo = SymmetricAlgorithm.Create())
        {
           using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
           {
              byte[] key = Encoding.ASCII.GetBytes(KEY);
              byte[] iv = Encoding.ASCII.GetBytes(IV);
              using (CryptoStream cs = new CryptoStream(ms, algo.CreateEncryptor(key, iv), CryptoStreamMode.Write))
              {
                 cs.Write(bytes, 0, bytes.Length);
                 cs.Close();
                 return ms.ToArray();
              }
           }
        }
    }

private static byte[] ToByteArray(object obj)
      {
         byte[] bytes = null;
         if (obj != null)
         {
            using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
            {
               BinaryFormatter bf = new BinaryFormatter();
               bf.Serialize(ms, obj);
               bytes = ms.ToArray();
            }
         }
         return bytes;
      }

通过这种方式对对象进行序列化和加密,我需要注意什么吗?

目的到底是什么? 如果您仅对在线数据的安全性感兴趣,那么既然您使用的是支持透明加密的.NET远程处理,为什么不使用它,而不是麻烦自己实现呢?

如果您确实坚持执行自己的加密,那么值得注意的是您似乎在使用常数IV,这是不正确的。 IV应该是一个随机字节数组,并且每个加密的消息都应不同。 通常在传输之前将其添加到加密消息中以供解密过程使用。

进一步说明,由于密钥和IV都是使用Encoding.ASCII.GetBytes从字符串转换而来的,而Encoding.ASCII.GetBytes用于7位ASCII输入,因此您将大大减少有效密钥空间。

我唯一能想到的是,通常在加密数据之后,您应该使用NULL在纯文本数组上写入。 这样一来,纯文本就无法在内存中恢复,并且如果将其以页面文件或交换方式写出到磁盘中,则恶意程序/用户将无法恢复该纯文本。 如果不考虑数据的敏感性,则可能没有必要,但这是一个很好的习惯。

编辑:

话虽这么说,但如果没有必要, 切勿自己动手(您很少这样做)。 除非您真的知道自己在做什么,否则很有可能将其弄糟并使其容易受到攻击。 如果您不理解或不喜欢内置的API, Bouncy Castle的工作人员在创建供您使用的库以及多种语言方面都做得非常出色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM