ASP.Net MVC cookies-防篡改?

ASP.Net MVC cookies-防篡改?,asp.net,security,cookies,encryption,Asp.net,Security,Cookies,Encryption,所以我读了一篇在/r/netsec上找到的简洁的文章: 有一件事真的让我陷入了一个循环,那就是人们可以在加密的cookie中翻转一点,并且实际上对包含的数据进行了有意义的更改 确保所有流量都通过SSL是很容易的(这不是关于安全传输的问题),但这让我真正思考了消息完整性以及如何查看原始cookie是否被篡改。通常,我只在cookie中存储经过身份验证的用户ID,并在防火墙后面处理所有其他内容。如果我可以篡改cookie,从客户端更改用户ID呢?上述文章表明这是可能的,并提供了使用LiB钠解决此问

所以我读了一篇在/r/netsec上找到的简洁的文章:

有一件事真的让我陷入了一个循环,那就是人们可以在加密的cookie中翻转一点,并且实际上对包含的数据进行了有意义的更改

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

特别是关于内置的ASP安全性,我需要做一些特殊的事情吗?这些事情还没有用处理cookie安全性的标准方式实现(让OWIN来做,或者使用FormsAuthentication.Encrypt)?如果不是,如何在引擎盖下处理消息完整性

通过进一步阅读,我找到了代码项目上的HttpSecureCookie类:

上面提到的是使用机器钥匙来做cookie防篡改,但我不清楚它到底是如何做防篡改的。这将如何防止恶意用户将原始文章中指示的位翻转到加密的cookie?

只需将该方法设置为
加密和验证

这将防止位翻转攻击,因为一旦位翻转,签名将不匹配。验证意味着消息已签名

验证是如何工作的? 验证算法

默认情况下,它使用HMACSHA256,这是使用构造应用的哈希

哈希对cookie进行签名-如果cookie值更改,哈希将不再匹配。由于最终用户不知道该秘密,因此无法更改cookie值

e、 g.尝试为带有secret
secret
的message
foo
生成SHA-256 HMAC

这将为您提供:
773ba44693c7553d6ee20f61ea5d2757a9a4f4a44d2841ae4e95b52e4cd62db4

请注意,如果将
foo
更改为其他内容,则散列将不同。这就是如何保护cookie免受篡改。此cookie的设置如下所示

Set-Cookie: id=foo&hash=773ba44693c7553d6ee20f61ea5d2757a9a4f4a44d2841ae4e95b52e4cd62db4
请注意,该值处于清除状态,但哈希签名可防止任何篡改。这只是验证

使用加密和验证选项,将首先加密
foo
,签名将防止任何位翻转。这允许最终用户以私有方式存储值

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

否则,用户可以记录有效的cookie值。假设他们被授予一天的管理员访问权限,并发布以下cookie:

username=admin&hash=71b3ba92493e92ce3c60042988e9de428f44b35a6be61c8da99fa43f950d3056
第二天,当管理员访问被撤销时,用户需要做的就是使用cookie编辑器将其cookie设置为上述值,然后他们将再次拥有对系统的管理员访问权限

要解决此问题,请发出如下cookie:

username=admin&expiry=20150508100000&hash=e38a3a003b30ceb9060165d19bb8d2a2bca6c7c531a37e888448ca417166db3a
这在cookie中有到期日期,并在哈希中签名。任何修改到期日期的尝试都将导致HMAC不匹配,用户将无法访问。这将防止对cookie到期日期或任何客户端的篡改

如果不使用表单身份验证,我们的其他“请勿乱动我的cookie”选项是什么

另一种方法是存储一个完全随机、加密安全的生成字符串,并将其设置为cookie值。在您的服务器上,使用SHA-2(无需salt)将其散列存储,然后查找此值以检索有关用户会话的详细信息。当然,这会有更多的开销。优点是可以通过删除条目在服务器端终止会话


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

能否详细介绍验证方面的工作原理?我很想知道IIS如何判断它是否被篡改。如果不使用表单身份验证,我们的其他“请勿乱动我的cookie”选项是什么?这太棒了。谢谢您能谈谈如何提高使用ASP.NET OWIN Cookie身份验证时的安全性吗?