首页 文章

会话ID应该在cookie中加密吗?

提问于
浏览
0

在单页应用中:

我想使用httpOnly / Secure cookie来验证Bearer令牌是否未从本地存储中被盗 .

换句话说,必须在被认为有效之前呈现并交叉检查cookie和承载令牌 .

例如:

用户使用用户名/密码成功登录 .

创建Jwt承载令牌并包括12345的会话ID .

此外,cookie被格式化为jwt并签名,并包含会话ID为12345的声明 .

现在,当使用令牌和cookie进行ajax请求时,将比较会话ID . 如果匹配,则满足请求 .

这样安全吗?或者会话ID是否应在cookie或令牌上加密?

1 回答

  • 1

    根据您告诉我们的内容,您的设置可能是安全的,也可能不是 . 您需要提供更多详细信息,以便我们确切了解 .

    例如,根据您基本上向用户发出的两个不同的承载令牌"the bearer of this token is allowed to access session 12345",其中一个令牌存储在 httpOnly cookie中,另一个存储在LocalStorage中,并且只有两个令牌存在并且有效且仅允许访问时才允许访问他们相互匹配 .

    但是,您的描述并未明确LocalStorage令牌是否也可用作cookie令牌,反之亦然 . 如果可能,捕获其中一个令牌的攻击者只需在同一个Ajax请求中两次提交相同的捕获令牌,一次在cookie中,一次在请求参数中,因此看起来有效 .

    此外,简单地检查请求中的两个令牌是否相同可能是不够的,因为攻击者可能能够捕获例如同一会话的两个不同的有效LocalStorage标记 . 相反,你需要做的是防止这样的攻击是在构成令牌的签名数据中包含某种令牌类型标识符(例如只需 type: "cookie"type: "param" )并验证每个令牌的类型是否真正匹配它们呈现给服务器的方式 .

    或者,您可以使用两个不同的签名密钥来存储cookie令牌和参数令牌;这样,将令牌从LocalStorage复制到cookie或反之亦然会自动使签名无效 .

    也就是说,只要您以某种方式确保每种类型的令牌仅在通过适当的渠道呈现时才有效,您的设置至少不比仅使用单个令牌更安全 . 它还应该防止某些类型的其他攻击,例如CSRF攻击(可以允许攻击者向合法用户's cookies) and certain kinds of JS injection attacks (which might compromise the user'的LocalStorage发出恶意请求,但不允许攻击者发送恶意请求) .

    但是,我们无法确定这些攻击是否是您的应用程序的相关威胁,以及是否可能存在其他攻击,您的方案不足以防范 . 特别是,虽然您的方案应该足以防止只破坏LocalStorage的攻击,但它会阻止您的方案 .

    也就是说,至少你的方案(如果正确实施)提供了CSRF保护,这是一个有用的东西 . 它是否提供更多东西是另一回事 .

    (在任何情况下,通常不需要加密会话ID或包含它的任何令牌,只要攻击者不能通过知道会话ID就做任何恶意行为 . 如果可以的话,那么会话ID就像“12345” “无论如何,这将是一个坏主意,因为攻击者很容易从0到999999尝试所有会话ID . ”

相关问题