我有一个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类/方法的任何建议吗?
答案 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”秘密字符串),你去除散列,取出原始的序列化实例,附加已知的秘密字符串并再次散列它。然后比较两个哈希的相等性。如果它们相等,则不会修改您的字符串。
您可能需要对Url / Base64编码您的字符串,以便它可以作为查询字符串使用。这一点也很重要,因为您需要查询字符串完全按照发送的方式到达。
答案 1 :(得分:4)
对流进行签名并将签名添加到查询中。使用HMAC签名算法,如HMACSHA1。您需要在客户端和服务器之间保密,以签署并验证签名。