-1

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

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

4

2 回答 2

3

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

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

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

于 2013-04-19T20:08:14.350 回答
1

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

编辑:

然而,话虽如此,如果你不需要(你很少这样做),就不要自己动手。除非您真的知道自己在做什么,否则很有可能您会搞砸它并使其容易受到攻击。如果您不了解或不喜欢内置 API,Bouncy Castle的绅士们在创建供您使用的库方面做得非常出色,并且使用了许多不同的语言。

于 2013-04-19T18:52:46.843 回答