2009-08-25 68 views
3

我有一個C#類,如下所示:如何序列化C#中的對象並防止篡改?

public class TestObj 
{ 
    private int intval; 
    private string stringval; 
    private int[] intarray; 
    private string[] stringarray; 

    //... public properties not shown here 
} 

我想這個序列化類的一個實例爲一個字符串。

另外:

我會追加這個字符串作爲查詢字符串參數去一個URL。所以我想盡一切努力確保字符串不容易被篡改。

此外,我想序列化方法是有效的,所以字符串的大小是最小的。

我應該使用特定的.NET Framework類/方法的任何建議?

回答

4

1)序列:

public String SerializeObject(TestObj object) 
{ 
     String Serialized = String.Empty; 
     MemoryStream memoryStream = new MemoryStream (); 
     XmlSerializer xs = new XmlSerializer(typeof(TestObj)); 
     XmlTextWriter xmlTextWriter = new XmlTextWriter (memoryStream, Encoding.UTF8); 
     xs.Serialize (xmlTextWriter, object); 
     memoryStream = (MemoryStream) xmlTextWriter.BaseStream; 
     Serialized = UTF8Encoding.GetString(memoryStream.ToArray()); 
     return Serialized; 
} 

2),以防止篡改:

  • 拿出一個祕密串,例如「MySecretWord」。
  • 將您的序列化對象實例作爲一個字符串,並將祕密字添加到它。
  • 哈希字符串(如SHA 或使用HMAC(由瑞摩斯的建議)
  • 追加哈希的查詢字符串

在接收端(也知道你的「MySecretWord」的祕密字符串)你去掉哈希,取出原始的序列化實例,附加已知的祕密字符串並再次散列它。然後比較兩個哈希值是否相等。如果他們是平等的,你的字符串沒有被修改。

您可能需要Url/Base64對您的字符串進行編碼,使其作爲查詢字符串。這一點也很重要,因爲您需要查詢字符串與發送完全一致。

+0

問題在於它沒有解決共享或更新與目標的祕密。據推測,如果他想防止篡改,那麼另一方需要知道如何檢查無效值。另外,如果他使用可預測的祕密,有人可能會篡改對象並重新計算散列。 – Omniwombat 2009-08-25 21:32:14

+0

不要重新發明輪子。 CLR提供HMAC簽名,由適當的密碼技術人員進行審查。 – 2009-08-25 21:33:45

+1

@Omniwombat:這當然不是一個高度安全的場景,因爲他正在處理查詢字符串信息傳輸。純粹的祕密存在會甩掉任何「攻擊者」。此外,祕密可以被選擇爲無限期地複雜,這使得哈希解決方案可以擴展到安全需求,但是在那種情況下,我寧願沿着線加密整個字符串。無論哪種方式,對於任何防篡改他都需要訪問目的地。 – Alex 2009-08-25 21:37:58

4

簽名流並將簽名添加到您的查詢中。使用HMAC簽名算法,如HMACSHA1。您需要在您的客戶端和服務器之間保密以簽署和驗證簽名。