为什么在身份验证中使用多个 cookie 而不仅仅是一个会话哈希值?

7
我通常在一个使用公告板软件的社区里活动。
我查看了这个软件在我的浏览器中保存的cookie。
正如您所看到的,它保存了6个cookie。其中,我认为对于身份验证很重要的是:
1. ngisessionhash: 当前会话的哈希值 2. ngipassword: 密码的哈希值(可能不是明文密码) 3. ngiuserid: 用户的ID
当然,这些只是我的假设。我不确定ngilastactivity和ngilastvisit是否出于同样的原因而使用。
我的问题是:为什么要使用所有这些cookie进行身份验证?我的猜测可能是生成会话哈希太容易了,因此使用哈希密码和用户ID增加了安全性,但cookie欺骗呢?我基本上将所有基本信息留在客户端。
你怎么想?
第一次更新: 这些cookie的内容是我认为它们包含的。我不确定。 当然,如果调用一个名为ngivbpassword的cookie并包含哈希值,我的猜测是hashedpassword。可能是密码+盐。
我主要关注的是在cookie欺骗攻击下,这些解决方案提供了太多信息。
第二次更新: 这个问题并不想批评这些特定软件的工作方式,而是通过这些答案,我想学习更多关于在Web环境中保护软件的知识。

2
ngivbpassword是密码的哈希值吗?真的吗?这是一个糟糕的主意,把你的密码哈希值发送到每个加密请求中... - shfx
是的,这是我的 :P cb17eee800v1361cee7985d731673c8g - dierre
@shfx:实际上这是一个哈希表。我更新了我的问题,因为也许我的假设不够清晰。 - dierre
除了学习目的之外,例如在这个例子中,尽可能重用现有的身份验证框架,通常包括一个安全的“记住我”实现。例如,请查看 https://github.com/delight-im/PHP-Auth,它既不依赖于框架也不依赖于数据库。 - caw
4个回答

2
这是因为会话(session)和登录(login)cookie可能具有不同的生命周期。
想象一下每天有数百万用户使用的网站。该网站不会将您的会话存储一年以便在您下次访问时重新登录。他们使用登录cookie来实现这一点。
这些cookie也称为“记住我”(Remember-Me)cookie。

2
基本上你的意思是:我检查会话,如果会话过期了,那么我会检查哈希密码和你的用户ID。如果它们匹配,我的系统将登录你。 - dierre
我同意你的答案。基本上,我很满意,因为这可能是实现“记住我”功能最安全的方式。考虑到他们只提供了客户所需的“最少”信息。当然,仅使用会话会更安全,但这将限制功能。 - dierre
2
最安全的方法是使cookie完全随机,限制其路径,使用HTTPS,并对IP地址和其他参数执行一些服务器端安全检查。 - Álvaro González
@Álvaro G. Vicario:IP检查一开始看起来非常不错,但它是你可以做的最有问题的限制。大多数用户都有动态IP,并且使用同一台笔记本电脑从家里、工作或网吧登录,每次使用不同的IP地址。 - m_vitaly
@dierre 关于在服务器上保持会话数据的内存限制,例如(160位+255字节)* 16000000,您可以在内存中为1600万个用户保存4GB的会话数据(其中160b是sha1哈希值,255B是登录,IP等),这是同时登录的用户。如果您有1600万个用户,则可以承受4GB的内存使用;)(如果我错了,请纠正我)。 - shfx
显示剩余9条评论

1

会话不是持久的,但 Cookies 是。

更新 #1:我没有使用过 vBullettin,但看起来这是经典的“记住我”功能。

更新 #2:

是的,这是一个记住我功能,我的问题是为什么他们用这种方式实现它

好吧...如何实现“记住我”功能?显然需要使用 Cookies,我想这一点很清楚。那么,你要存储什么呢?

最天真的方法是以明文形式存储用户名和密码,并执行常规身份验证。这是你可以使用的最不安全的机制之一,但有些网站确实会这样做。

第二个稍微不那么天真的方法是存储用户和密码的哈希值并执行修改后的常规身份验证。它不像上一种方法那么糟糕,但仍然存在一些问题;例如,没有有效的方法从服务器禁用或过期保存的 cookie。

第三种方法是保留一个包含“已记住”会话的数据库表,用长唯一字符串标识每个会话,然后将这样的字符串存储在 cookie 中。该字符串可以是随机的或计算的,但当然,随机性有优势,即使您知道算法,也无法猜测该字符串。

通过在服务器中存储日期、IP地址和其他数据片段,可以进一步增强安全性。

正如我所说,我对vBulleting一无所知,但似乎他们正在使用方法2或方法3。

更新#3:

这些cookie的内容是我认为它们包含的。我不确定。当然,如果调用一个名为ngivbpassword的cookie并包含哈希,则我的猜测是hashedpassword。可能是password + salt。[...] 我最担心的是这些解决方案在cookie欺骗攻击下提供了太多信息。

成功的cookie欺骗允许您完全模拟用户,因此您可以进入控制面板并享受免费自助餐,从而使cookie内容无关紧要。

无论他们存储的是加盐密码还是仅仅是名称,这是我不知道的事情。


也许我的问题没有表达清楚。我并不是在问为什么他们一般使用cookie。我问的是关于cookie配置的问题。为什么他们使用哈希会话、哈希密码和用户ID。为什么要这样做。 - dierre
是的,这是一个记住我功能,我想知道他们为什么要以那种方式实现它。 - dierre
因为他们做错了。您可以通过在服务器上设置会话cookie和会话表的TTL来控制会话TTL。 - shfx
我也更新了我的问题,希望现在清楚我在寻找什么 :) - dierre
Alvaro,我对你的问题也感到满意,但我只能给出一个正确答案。Vitaly的问题在问题上更加具体。下次我会尽量更清楚明确 :) - dierre
显示剩余3条评论

0

这里有一个问题,你有什么顾虑吗?你正在构建某种身份验证系统吗? 我也认为在cookie中存储用户ID和密码可能存在安全问题。 用户ID是编码还是整数?


1
只是一个整数。我并不是在构建一个。但我正在攻读计算机工程硕士学位,上个学期的一部分时间我花在了学习安全问题上,所以对于我来说理解为什么vB“过度使用”cookie来处理身份验证是一个自然的问题。 - dierre
首先,我不知道vB如何使用这些cookies。我很想进一步讨论这个话题,因为它是我最感兴趣的,但我现在正在用手机。我有一个开源的PHP用户认证类项目叫做uFlex,在其中我使用内置编码器创建了一个单一的哈希值,用于自动登录密码哈希和编码用户ID。 - Pablo

0
  • 关于Cookies,它们应该是尽可能小的有关服务器上你身份信息的一部分。

  • Sessionhash、session_id或sid是你在服务器上的唯一ID(你的会话)。其余的Cookies可以很容易地在服务器端隐藏。

  • 将密码哈希保存在Cookies中是一个安全问题。你应该避免这样做。

  • 最后4个Cookies来自Google广告。

PS. 大多数公告板软件都不是很好。


我更新了我的问题。我更好地解释了哈希密码的事情。我使用哈希来表示加密,但不够清晰。 - dierre
@dierre 加密确实不同于哈希,但你已经明白了。你的硕士学位怎么样了?很抱歉两年半后才回答,我刚刚偶然看到这个有趣的讨论 :) - Jonast92

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接