通过添加哈希来防止查询字符串操作?

sai*_*lle 1 asp.net security hash query-string

为了保护Web应用程序免受查询字符串操作,我正在考虑向每个url添加一个查询字符串参数,该参数存储所有其他查询字符串参数和值的SHA1哈希值,然后根据每个请求的哈希值进行验证.

此方法是否提供强大的保护,防止用户操纵查询字符串值?这样做还有其他任何缺点/副作用吗?

我并不特别关注这个私人网络应用程序的"丑陋"网址.由于对于相同的查询字符串参数,哈希值始终相同,因此Url仍然是"可收藏"的.

这是一个ASP.NET应用程序.

Jer*_*ell 8

我不确定这提供了什么样的安全性.如果中间人攻击者想要更改参数,他们必须做的就是更改查询字符串并重新计算SHA-1哈希并将该请求发送到服务器.

例如,浏览器发送的URL可能是:

http://www.example.com/addUser.html?parameterA=foo&hash=SHA1("parameterA = foo")

如果攻击者拦截了这个,他们可以用这种方式编辑它:

http://www.example.com/adduser.html?parameterA=bar&hash=SHA1("parameterA = bar")

实际上,这可以归结为这样一个事实,即你只能像参数本身一样信任哈希.

解决这个问题的一种方法是,如果用户只有他们和服务器知道的密码,那么攻击者如果更改参数就不可能重新计算哈希值.例如:

http://www.example.com/addUser.html?parameterA=foo&hash=SHA1("parameterA = foo"+"theuserpassword")

但是不要把密码作为URL中的一个参数:)

重要的是要注意,这不是用于验证双方之间传递的消息的完整性的现有技术.今天使用的是基于哈希的消息认证码(HMAC)算法的一种形式,该算法在HMAC中有很好的描述,并且最终在RFC2104FIPS Pub 198-1中描述.

  • 你可以简单地为哈希做一个Salt来防止操纵/中间人等. (6认同)
  • 如果你的意思是像/ etc/passwd盐那样的盐,那么这些盐就不能提供任何抵御mitm攻击的安全性.盐是一般的公共知识,只能使用蛮力攻击来反转哈希变得更加困难.'salt'(实际上是键控哈希中的键)必须是保密的,以防止攻击者能够更改和重新计算摘要.这基本上是一种认证方案,通常需要一些共享的秘密知识. (2认同)