ASP.Net MVC cookies - 防篡改?

时间:2015-05-06 15:19:01

标签: asp.net security cookies encryption

所以我正在阅读我在/ r / netsec上发现的一篇文章:

https://paragonie.com/blog/2015/05/using-encryption-and-authentication-correctly

真正让我感到厌倦的一件事是,人们可以在加密的cookie中翻转一下,实际上对所包含的数据进行了有意义的改变。

确保所有流量都通过SSL很容易(这不是一个关于安全传输的问题),但这让我真正考虑了消息的完整性以及如何查看原始cookie是否被篡改。通常,我只会在cookie中存储经过身份验证的用户ID,并处理防火墙后面的所有其他内容。如果我可以篡改该cookie以从客户端更改用户ID,该怎么办?上述文章表明这​​是可能的,并且提供了使用优选的libsodium来解决该问题的建议。我知道这个图书馆(我自己没有使用它),但是我认为需要ASP内置的安全机制以外的东西,这让我进一步深入兔子洞。

特别是关于内置ASP安全性,我是否需要做一些特殊的事情,这些特殊事务尚未以标准的方式处理cookie安全性(让OWIN做其事或使用FormsAuthentication.Encrypt)?如果没有,那么如何处理消息完整性?

进一步阅读让我参与了这个关于代码项目的HttpSecureCookie类: http://www.codeproject.com/Articles/13665/HttpSecureCookie-A-Way-to-Encrypt-Cookies-with-ASP

以上表示使用机器密钥进行cookie防篡改,但我不清楚它是如何使其防篡改。如何防止恶意用户将原始文章中指示的位翻转到加密的cookie?

1 个答案:

答案 0 :(得分:10)

只需将forms authentication protection方法设置为Encryption and validation

这样可以防止数据翻转攻击,因为一旦翻转,签名就不会匹配。验证表示邮件已签名。

验证如何运作?

验证算法can be set in web.config in the validationAlgorithm attribute of the machineKey element

默认情况下,它使用HMACSHA256,这是使用SHA-256构造应用的HMAC哈希值。

哈希对cookie进行签名 - 如果cookie值发生变化,则哈希将不再匹配。由于最终用户不知道秘密,他们无法更改cookie值。

e.g。尝试on here为邮件foo生成带有secret邮件的SHA-256 HMAC。

这应该会给你:773ba44693c7553d6ee20f61ea5d2757a9a4f4a44d2841ae4e95b52e4cd62db4

请注意,如果您将foo更改为其他内容,则哈希值会有所不同。这就是如何保护cookie免受篡改。该cookie将设置如下。

Set-Cookie: id=foo&hash=773ba44693c7553d6ee20f61ea5d2757a9a4f4a44d2841ae4e95b52e4cd62db4

请注意,该值为clear,但散列签名可防止任何篡改。这只是验证。

加密和验证选项foo将首先加密,签名可防止任何位翻转。这使得值可以从最终用户私下存储。

如果您在表单身份验证之外实现此功能,请记住在Cookie中存储某种类型的到期日期并将其包含在签名中。可以在服务器端检查此日期。表单身份验证默认执行此操作。

否则,用户可以记下有效的cookie值。假设他们在一天内获得管理员访问权限并发出以下cookie:

username=admin&hash=71b3ba92493e92ce3c60042988e9de428f44b35a6be61c8da99fa43f950d3056

撤销管理员访问权限的第二天,所有用户需要做的是使用cookie编辑器将其cookie设置为上述值,并且他们将再次拥有对系统的管理员访问权。

要解决此问题,您可以发出如下cookie:

username=admin&expiry=20150508100000&hash=e38a3a003b30ceb9060165d19bb8d2a2bca6c7c531a37e888448ca417166db3a

这在cookie中有到期日期,在哈希中签名。任何修改到期日的尝试都将导致HMAC不匹配,并且用户将无权访问。这将防止任何篡改cookie到期日期或任何娱乐客户端。

  

如果不使用表单身份验证,我们还有哪些其他不会混乱的cookie选项?

另一种方法是存储完全随机的,加密安全的生成字符串,并将其设置为cookie值。在您的服务器上,使用SHA-2存储它(不需要盐)并查找此值以检索有关用户会话的详细信息。当然这有一些开销。优点是可以通过删除条目来杀死服务器端的会话。

这也可以通过表单身份验证来完成,但是您需要实现自定义提供程序。