如何在C#中序列化对象并防止篡改?

我有一个C#类如下:

public class TestObj { private int intval; private string stringval; private int[] intarray; private string[] stringarray; //... public properties not shown here } 

我想将此类的实例序列化为字符串。

此外:

我将此字符串作为QueryString参数附加到URL。 所以我想尽一切努力确保字符串不会被轻易篡改。

另外,我希望序列化方法有效,因此字符串的大小是最小的。

我应该使用特定.NET Framework类/方法的任何建议吗?

对流进行签名并将签名添加到查询中。 使用HMAC签名算法,如HMACSHA1 。 您需要在客户端和服务器之间保密,以签署并validation签名。

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(由Remus建议)
  • 将哈希附加到查询字符串

在接收端(也知道你的“MySecretWord”秘密字符串),你去掉哈希,取出原始的序列化实例,附加已知的秘密字符串并再次哈希。 然后比较两个哈希的相等性。 如果它们相等,则不会修改您的字符串。

您可能需要对Url / Base64进行编码,以使其作为查询字符串。 这也很重要,因为您需要查询字符串与发送完全一致。