检查用户是否更改了数据

时间:2009-11-18 16:52:00

标签: asp.net-mvc hash

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

用户可以接受该建议并受到信任。如果他改变地址,他就不会被信任。

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

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

编辑:

到目前为止,这种方法运作良好。我仍然要用umlaute(ä,ü)进行测试。

                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

4 个答案:

答案 0 :(得分:1)

使用HMAC (Hash-based Message Authentication Code) - HMAC是为了这个目的而发明的;使用对称密钥验证数据。我自己并不熟悉.NET,但标准库似乎提供了许多继承自System.Security.Cryptography.HMAC的类。 HMAC优于普通哈希,因为它不易受哈希长度扩展攻击的攻击。<​​/ p>

HMACSHA256看起来像个好人。

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

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

答案 1 :(得分:0)

  

有没有一个好方法来检查是否   显示给用户的数据是相同的   作为他发布的数据?

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

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

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

答案 2 :(得分:0)

我喜欢你的想法..你连接地址部分使它成为一个大字符串并做一个ToHower版本的字符串的GetHashCode。然后使用相同的方法进行比较。

答案 3 :(得分:0)

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

  

更改事件在控件时触发   失去输入焦点及其值   自获得关注以来已被修改。

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

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