【问题标题】:How do I create a cookie which is theft-proof and can not be tampered by a user/client?如何创建防盗且不会被用户/客户端篡改的 cookie?
【发布时间】:2012-08-31 00:52:38
【问题描述】:

防盗意味着我可以检测到这是来自不同的客户端 IP 或通过不同的路由(例如客户端在代理后面或其他情况下)。

防篡改意味着我可以检测到 cookie 无效并且不是由服务器发送的。

【问题讨论】:

  • 您使用什么服务器端语言?此外,如果用户拥有动态 IP 地址,这是否重要?此外,您要查找的词是“防篡改”。钢化是对玻璃进行的处理。
  • 每个罐头都有一个开罐器。 “安全”不是二元条件,而是相对条件。
  • @只是我的正确意见,同意。如果客户的计算机上有一些恶意软件,那么它可能会改变页面(和 cookie)的显示

标签: security cookies cryptography


【解决方案1】:

cookie必须始终是一个Cryptographically secure pseudo random number (CSPRNG),也是一个Cryptographic Nonce或一个只使用一次的值。该值用于访问服务器端的状态信息。

为什么?攻击者是否修改该值无关紧要,他仍然无法更改会话状态。

加密 cookie 怎么样?在安全方面,最好避免所有问题。这是对密码学的滥用,因为它为最近的ASP.NET Oracle CBC Padding attack 等攻击打开了大门。

要添加的其他一些功能:

“Secure Cookies” - 可怕的名字,但它是一个强制 cookie 始终通过 HTTPS 传输的标志。这样可以确保您永远不会违反OWASP A9

“HTTPOnly Cookies” - 这使得 JavaScript 无法访问 document.cookie 并使 cookie 更难被劫持。

确保修补您的 Session Riding aka CSRF

确保使用Sitewatch Free EditionWapiti 测试您的应用程序的XSS。即使使用 HTTP Only cookie XSS 也可以用来绕过基于 Token 和 Referer 的 CSRF 保护。

【讨论】:

    【解决方案2】:

    我不是这个领域的专家,但我觉得我可以贡献一些想法来解决这个问题。

    1. 生成一个固定长度的大随机数。
    2. 用盐对数字进行哈希处理。
    3. 将加盐哈希附加到随机数的末尾(从 1 开始)并将其发送给客户端。
    4. 使用 SSL。
    5. 要检查完整性,拆分字段,将盐添加到第一部分,重新​​散列。如果哈希与第二个字段不匹配,则它已被篡改。

    正如我之前所说,我不是专家,但这似乎是可行的。

    【讨论】:

    • ssl4?我认为您的意思是 ssl3,但我仍然不明白这与 cookie 有什么关系。数字加盐?我认为您在谈论 MAC,即使这样,这也是对此类功能的严重滥用。简而言之,这个提议的安全系统可以防御未知的攻击。
    • @Rook:服务器会生成原始cookie并通过SSL发送给客户端。然后客户端会回显 cookie。听起来您在下面得到了“正确”的回应。
    【解决方案3】:

    回答您的问题: 您无法检测您的 cookie 是否被盗或复制。在它离开你的服务器后,你不知道它发生了什么——你怎么会?

    但是,您可以使用 SHA-1 等安全哈希算法检测您发送的原始 cookie 数据是否已被篡改。

    SHA-1 算法会生成一个哈希签名,如果应用它的数据发生更改,该哈希签名会发生变化(或统计上极有可能发生变化)。因为您不仅使用数据生成散列,还使用秘密Salt只有你可以为给定的数据生成正确的散列签名。如果有人修改了您的数据,他们将无法在没有 Salt 值的情况下对哈希进行相应的更改。您当然会检查所有返回的数据,以验证随附的哈希签名是否正确。这需要您将散列签名附加到数据的末尾,或者使用一些类似的机制将数据和散列签名保持在一起。

    请记住,盐值需要保密。

    正如@Rook 所指出的,从安全角度来看,最好完全不将您的数据存储在 cookie 中,从而完全避免该问题。但我们并不是都在编写网上银行应用程序,散列签名可能足以满足您的需求。

    看看OWSAP 上的可用资源非常值得。 OWASP 有一系列Top 10 最常见的 Web 应用程序安全漏洞的优先级列表。确保您熟悉这些内容,以免犯下成千上万其他人曾经犯过的错误。

    【讨论】:

    • “您无法检测到您的 cookie 是否被盗或复制”我当然不能。我想知道我的服务器是否在 IP 地址 X 向客户端 a 提供了 cookie,如果他的 cookie 放在 IP 地址 Y 上,即这个 cookie 被盗了,我想以某种方式跟踪它。我想知道是否存在完整的证明方式,以便服务器可以检索客户端机器的某些唯一值。最终,许多人坐在代理或路由器后面,服务器将获得相同的 IP 地址。
    • 您无法从 javascript 中获取唯一的机器 ID - 即使您可以,它也很容易伪造。您的 cookie 是否包含身份验证票证?如果是这样,您应该在一段时间后让它超时,以便 cookie 被盗的窗口很小。
    • SHA1(secret_salt + message) 不安全。而是使用HMAC,这是它的安全变体。见en.wikipedia.org/wiki/Length_extension_attack
    猜你喜欢
    • 1970-01-01
    • 2012-07-30
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2021-02-04
    • 2019-01-31
    • 1970-01-01
    相关资源
    最近更新 更多