我正在Node.js和PostgreSQL中实现自定义身份验证和会话管理系统。我的目标是实现在2周后到期的会话(如果没有刷新/更新)。
OWASP和其他资源建议将未散列的会话in存储在数据库和cookie中。但是,如果这些会话if是从数据库泄漏出来的,则可以使用它们在过期之前成功地进行身份验证。
我不知道散列会话是否会增加一些针对这种情况的安全性。我正在考虑的实现是这样工作的:
id (UUID v4)和token_hash (加密安全随机字符串的SHA256散列)将会话保存到数据库中。id和原始未散列token都保存到响应会话cookie(s)中。然后,在随后的请求中:
id和token。id中找到了会话,那么token将根据token_hash进行验证。如果成功,则对用户进行身份验证。(我考虑同时使用会话id和token/token_hash,因为我认为先使用id查找会话,然后根据token_hash验证token会更快。否则,token将需要对每个请求进行散列,以找到会话,我猜想这会更慢,即使使用一些像BLAKE3这样的快速散列函数。)
发布于 2023-02-20 18:41:35
要回答您的问题:是的,哈希会话ID确实提供了针对您所担心的特定场景的保护。存储和验证每个请求上的哈希确实会保护您免受数据库泄漏。
考虑到您的会话有2周的时间,您可以通过缓存数据,然后只对散列令牌执行DB查找来加快对会话ID的检查。类似地,可以使用不同的DB架构来加快查询速度。
这些评论正在讨论你应该多么关心这个场景。有一些有效的评论,但我将把讨论留待注释部分讨论。
发布于 2023-02-22 22:02:57
会议一般都很短。OWASP会话长度指南是:
还建议在用户关闭浏览器时结束这些会话,即您应该使用会话曲奇。浏览器关闭时,浏览器知道如何删除这些cookie。
在这些约束条件下,存储实际的会话ID不应该是一个问题,因为黑客获取的任何会话ID在使用时可能不再有任何用处。这就是为什么它们通常不会被散列。
所有这一切,我看到,你有一个要求,用户应该能够再次访问该网站在两周内,而不必再次登录。这是一种常见的需求,而且通常不支持字面上的要求(对于一个实际持续两周的会话)。相反,允许会话过期,但浏览器将得到一个令牌,当用户再次打开浏览器时,该令牌可用于重新创建会话。例如,您可以设置包含用户标识符的持久cookie,并对其进行加密或使用服务器只知道的秘密密钥对其进行签名。您还可以嵌入将令牌绑定到特定浏览器的信息(例如IP地址、用户代理标头和浏览器指纹)。当然,令牌将包括一个过期日期(您不应该依赖cookie本身的过期日期)。服务器验证令牌及其签名,并生成一个新会话,根据需要恢复所需的任何状态。对于最终用户来说,这与非常长的会话是无法区分的。
如果这样做,除了确保会话If具有密码随机性和唯一性之外,您不需要做任何特殊的事情来保护会话If。只需保护(加密或签名)持久令牌即可。
发布于 2021-09-27 05:49:59
我认为这将耗费时间,因为您将验证每个请求的id和令牌。在我看来,您可以做的是实现无状态JWT授权。在JWT令牌中实现对用户ID的自定义声明w.r.t,并在生成JWT令牌时设置过期时间。它将最小化验证的计算时间。
https://security.stackexchange.com/questions/255581
复制相似问题