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

时间:2009-08-25 21:22:24

标签: c# .net asp.net serialization encryption

我有一个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类/方法的任何建议吗?

2 个答案:

答案 0 :(得分: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;
 }

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编码您的字符串,以便它可以作为查询字符串使用。这一点也很重要,因为您需要查询字符串完全按照发送的方式到达。

答案 1 :(得分:4)

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