簡體   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