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

时间:2018-05-27 16:50:24

标签: security jwt session-cookies

在单页应用中:

我想使用httpOnly / Secure cookie验证没有从本地存储中窃取Bearer令牌。

换句话说,必须在被认为有效之前提交并交叉检查cookie和持票人令牌。

例如:

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

创建了一个Jwt Bearer令牌,其中包含一个12345的会话ID。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

例如,根据您告诉我们的内容,您基本上向用户发出两个不同的承载令牌,说明该令牌的持有者可以访问会话12345" ,其中一个令牌存储在httpOnly cookie中,另一个存储在LocalStorage中,并且只有两个令牌都存在且有效且彼此匹配时才允许访问。

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

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

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

也就是说,只要您以某种方式确保每种类型的令牌仅在通过适当的渠道呈现时才有效,您的设置至少不低于安全,而不仅仅是使用单个令牌。它还应该防止某些类型的其他攻击,例如CSRF攻击(可以允许攻击者使用合法用户的cookie发出恶意请求)和某些类型的JS注入攻击(这可能会危及用户和#39) ;是LocalStorage,但不是他们的cookies。)

但是,我们无法确定这些攻击是否是您的应用程序的相关威胁,以及是否可能存在其他攻击,您的方案 不足以防范。特别是,虽然您的方案应该足以防止攻击LocalStorage的攻击,但值得注意的是,大多数可以做到这一点的攻击也允许攻击者做其他事情,例如从用户的浏览器中发出自己的Ajax请求(这会阻碍你的方案)。

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

(在任何情况下,通常不需要加密会话ID或包含它的任何令牌,只要攻击者只是通过了解会话ID就不能做任何恶意行为。如果可以的话,那么拥有类似" 12345"的会话ID无论如何都是个坏主意,因为攻击者很容易从0到999999尝试所有会话ID。)