更好的安全性 - cookie 中的会话 ID 与加密 cookie

信息安全 饼干 会话管理
2021-08-20 11:43:47

讨论这两种存储会话数据的方法:

不确定哪个更安全,因为在阅读了一些关于节点客户端会话的内部结构之后,有很多潜在的攻击向量需要考虑,我不确定它们占了多少。例如,他们通过在一个地方使用 constantTime 算法来解决定时攻击。但是还有更多潜在的漏洞,而且不是专家,我无法判断它作为一个库做得有多好。

另一方面,我看到有人说在数据库中存储会话 ID 是不行的。但至少在这里你可以将会话 ID 列入黑名单。

任何建议或指导将不胜感激。谢谢你。

2个回答

安全性差异主要在于实现细节。从根本上讲,这两种方法是相同的:您在客户端上存储对客户端毫无意义的数据块,以保留请求之间的某些状态。不同之处在于会话 id cookie 本身是无意义的,因为它们不代表任何有意义的信息,而加密的 cookie 是无意义的,因为客户端不具备解密数据的能力。

加密 cookie 从根本上来说更复杂:它们更大,它们需要复杂的算法,它们需要正确实现该算法,它们确实包含实际数据,因此值得攻击,它们确实需要管理密钥。由于它们的去中心化性质,它们也更难撤销。

会话 id cookie 非常简单:一个无意义的随机 id,仅引用存储在其他地方的数据。唯一的漏洞*是可猜测性,这很容易通过增加长度以及旋转和过期 id 来防止。我不知道为什么将会话 ID/数据存储在数据库中无论如何都是一个坏主意;只要数据库是安全的,就没有问题。如果您的数据存储容易受到攻击,那么您会遇到比会话数据存储位置更大的问题。

(* 除了直接劫持,这是所有 cookie 的相同漏洞,以及实现特定的缺陷,如接受未定义的会话 id 等。)

鉴于此,您需要确定加密 cookie 增加的攻击面是否值得无状态服务器的好处,以及您是否信任加密的实现。对于高可扩展性,我会认真研究它,对于小规模服务,我会尽可能简单。

鉴于我刚刚问了一个关于加密的问题,我不会认为我是专家,但是:

a) 如果适当加密,那么 cookie 中的数据应该没问题...

  • 归根结底,您将数据存储在最终用户的机器上。对于共享机器来说不是很好,但你可以说算法很可能足够强大
  • 如果它有很多数据,你会在每次页面加载时来回传输它,所以你可能会减慢你的应用程序。

b) 如果您使用 SSL 连接,会话 ID 也应该没问题(具有适当的长度)

  • 重新生成会话密钥
  • 根据您的应用程序,您可以最大限度地减少对个人数据的查看。例如,如果您使用会话来跟踪用户的进度但不将他们的信息返回给他们(通过会话),这可以说是更安全。