如何在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进行编码,以使其作为查询字符串。 这也很重要,因为您需要查询字符串与发送完全一致。