【问题标题】:Check if the user changed data检查用户是否更改了数据
【发布时间】:2009-11-18 16:52:00
【问题描述】:

当用户在我们的网站上注册时,我们会使用地址验证服务检查地址。如果找到输入的地址但有一些错误,此服务可以返回地址建议。该建议返回给用户。

用户可以接受建议并受到信任。如果他更改了地址,他就不受信任。

有没有什么好方法可以检查显示给用户的数据是否与他发布的数据相同?我想我需要一个带有地址数据哈希的隐藏字段。但我不确定我应该采用哪种算法。如果可能,算法应该不区分大小写。

算法应该创建一个防篡改的单向哈希。

编辑:

到目前为止,这工作得很好。我仍然需要使用变音符号 (ä,ü ) 进行测试。

                StringBuilder addressData = new StringBuilder();
            addressData.Append(FirstName);
            addressData.Append(LastName);
            addressData.Append(StreetNumber);
            addressData.Append(StreetName);               
            addressData.Append(City);
            addressData.Append(CountryISO);
            addressData.Append(Zip);
            string stringVal = addressData.ToString().ToLower();

            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            byte[] keyByte = encoding.GetBytes(ApplicationConfiguration.ShaKey);
            byte[] messageBytes = encoding.GetBytes(stringVal);

            HMACSHA256 hmacsha256 = new HMACSHA256(keyByte);
            byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
            string hash = ByteToString(hashmessage);

            return hash

【问题讨论】:

    标签: asp.net-mvc hash


    【解决方案1】:

    使用HMAC (Hash-based Message Authentication Code)——HMAC 正是为此目的而发明的;使用对称密钥对数据进行身份验证。我自己对 .NET 并不熟悉,但标准库似乎提供了许多继承自 System.Security.Cryptography.HMAC 的此类类。 HMAC 比普通散列更好,因为它不易受到散列长度扩展攻击

    HMACSHA256 看起来是个不错的候选人。

    如果您想防止重放攻击,您还应该考虑在字符串中添加unique value (a nonce) - 否则用户可以重新发送一封带有早期 HMAC 签名的早期电子邮件。

    HMAC 密钥必须是服务器端密钥。

    【讨论】:

      【解决方案2】:

      我喜欢你的想法。你将地址部分连接起来使其成为一个大字符串,并执行一个 GetHashCode 的 ToLower 版本的字符串。然后用同样的方法进行比较。

      【讨论】:

        【解决方案3】:

        有什么好方法可以检查 向用户显示的数据是相同的 作为他发布的数据?

        是的 - 您可以将发送给用户的数据存储在数据库中。

        当用户提交表单时,将数据库中的数据与用户提供的数据进行比较。 您可以将数据转换为 CRC32 哈希,但如果您选择比较哈希字符串,请务必以相同的方式连接不同的数据对象。

        编辑: 顺便说一句,我认为创建一个哈希字符串是没有用的,因为数据无论如何都存储在数据库中并且不会很长时间。

        【讨论】:

        • CRC32 可以被篡改。我需要一个安全的单向哈希。
        • @Mathias Fritsch:考虑 MD5。
        【解决方案4】:

        如果允许使用 JavaScript,也许你可以使用 jQuery change() 事件,并通过设置客户端隐藏值来检查这一点,以了解是否有变化:

        当控件发生变化时触发 失去输入焦点及其值 获得焦点后已被修改。

        $("input[type='text']").change( function() {
          //do something here, maybe set a hidden value
        });
        

        然后在你的控制器上你可以检查这个隐藏的值,或者你可以花点心思,用一些 ajax 立即检查这个值,但可能因为你的安全要求,这可能是有风险的。

        【讨论】:

        • Javascript 不是一个选项,因为用户仍然可以篡改返回到服务器的数据。
        • 嗯,这确实是个问题......我认为这没有简单的方法,也许如果你在散列的地方加盐,你可能必须在每个地方保存一个盐并且hashed(salt + place),就像在 SHA-1 中加盐的密码一样。但这是多余的,因为在这种情况下我们不知道哪个是选定的值。我们需要一些其他的东西,比如 ID(登录时的用户名),它可以让我们准确地知道选择哪种盐,并且这必须是隐藏值的形式,两种方式散列。另一个可能的选择是以某种方式在用户会话中保存一个键并使用它来比较 POST 的值。
        • 天哪,如果您可以只使用 HMAC 并完成它,为什么要重新发明具有潜在安全漏洞的轮子。将密码学留给密码学家。
        • @intgr: jeje .. 是的,我真的不认为这种过于复杂的事情是必要的,如果你在做一个 POST,几乎任何东西都可以被篡改,也许是一些基本的东西,比如检查 POST 引用的标题并使用Antiforgery Token,并留在隐藏字段中可以很好地工作。
        猜你喜欢
        • 1970-01-01
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-26
        • 2010-10-01
        • 2012-04-28
        相关资源
        最近更新 更多