将Object序列化为字节[],然后对字节[]进行加密

本文关键字:字节 加密 然后 序列化 Object | 更新日期: 2023-09-27 18:10:08

我遇到了一种情况,我需要加密一个对象,以便通过. 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;
      }

用这种方式序列化和加密对象,有什么需要注意的吗?

将Object序列化为字节[],然后对字节[]进行加密

这里的目的究竟是什么?如果您只对在线数据的安全性感兴趣,那么既然您使用的是支持透明加密的。net远程处理,为什么不使用它,而要自己去实现它呢?

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

作为进一步的说明,因为您的键和IV都是从使用Encoding.ASCII的字符串转换而来的。GetBytes,这是针对7位ASCII输入的,你正在显着减少有效的密钥空间。

我能想到的唯一一件事是,通常在加密数据之后,您应该用null重写纯文本数组。这是为了使明文不能在内存中恢复,并且如果它在页面文件或交换中被写入磁盘,它将不能被恶意程序/用户恢复。如果数据的敏感性不是一个问题,那么这可能不是必需的,但这是一个很好的习惯。

编辑:

话虽这么说,但是,如果你没有必要(你很少这样做),永远不要自己滚动。很有可能你会把它搞砸,使它容易受到攻击,除非你真的知道你在做什么。如果您不理解或不喜欢内置api, Bouncy Castle的代理已经在创建供您使用的库方面做了出色的工作,并且使用了许多不同的语言。