【问题标题】:ASP.Net MVC cookies - tamper resistant?ASP.Net MVC cookie - 防篡改?
【发布时间】:2015-05-06 15:19:00
【问题描述】:

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

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

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

确保所有流量都通过 SSL 很容易(这不是关于安全传输的问题),但这让我真正想到了消息完整性以及如何查看原始 cookie 是否已被篡改。通常,我只会将经过身份验证的用户 ID 存储在 cookie 中,并处理防火墙后面的所有其他内容。如果我可以篡改该 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?

【问题讨论】:

    标签: asp.net security cookies encryption


    【解决方案1】:

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

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

    验证是如何工作的?

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

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

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

    例如尝试使用on here 为消息foo 生成一个SHA-256 HMAC,并使用秘密secret

    这应该给你: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 身份验证时的安全性?
    猜你喜欢
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2011-06-13
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多