【问题标题】:How to serialize an object in C# and prevent tampering?如何在 C# 中序列化对象并防止篡改?
【发布时间】:2010-11-22 19:08:41
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这个问题是它没有解决与目的地共享或更新密钥的问题。想必如果他想防止篡改,那么对方需要知道如何检查无效值。此外,如果他使用可预测的秘密,有人可能会篡改对象并重新计算哈希。
    • 不要重新发明轮子。 CLR 提供开箱即用的 HMAC 签名,并由适当的密码学家审查。
    • @Omniwombat:这肯定不是一个高度安全的场景,因为他正在处理信息的查询字符串传输。秘密的纯粹存在会甩掉任何“攻击者”。此外,可以选择无限复杂的秘密,这使得散列解决方案可扩展以满足安全需求,但在这种情况下,我宁愿加密整个字符串。无论哪种方式,为了防篡改,他都需要访问目的地。
    • @Alex 请注意“肯定不是高安全性场景”和“会甩掉任何'攻击者'”这样的术语我们不知道他的要求,而且永远不会有技术可以保证阻止所有攻击。 (另外,我认为您的意思是“任意”复杂。)
    • @Omniwombat:我可以让 cmets 整天批评其他人的解决方案。我已经为他提供了一个快速工作的解决方案,我可以推断出他的要求,而不是帮助他使用 OTP 支持的符合银行标准的 RSA 异步加密编写整个事情。关键点:我还没有看到你提供答案。不如你给我们举一个你的代码魔法的例子,它是可重用的、高度安全的、稳定的、处理开销低、没有内存占用,也许它也可以在我们做咖啡的时候煮咖啡。
    【解决方案2】:

    签名流并将签名添加到您的查询中。使用 HMAC 签名算法,例如 HMACSHA1。你需要在你的客户端和你的服务器之间有一个秘密来签名和验证签名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      相关资源
      最近更新 更多