使用更多 cookie 而不仅仅是会话哈希进行身份验证的原因是啥?

Posted

技术标签:

【中文标题】使用更多 cookie 而不仅仅是会话哈希进行身份验证的原因是啥?【英文标题】:Reason to use more cookies than just a session hash for authentication?使用更多 cookie 而不仅仅是会话哈希进行身份验证的原因是什么? 【发布时间】:2011-05-31 04:16:34 【问题描述】:

我通常在使用公告板软件的社区中闲逛。

我正在查看这个软件在我的浏览器中保存为 cookie 的内容。

如您所见,它保存了 6 个 cookie。其中,我认为对认证很重要的是:

    ngisessionhash:当前会话的哈希 ngipassword: 密码的散列(可能不是普通密码) ngiuserid:用户 ID

这些当然是我的假设。我不确定是否出于相同的原因使用了 ngilastactivityngilastvisit

我的问题是:为什么要使用所有这些 cookie 进行身份验证?我的猜测是,可能生成会话哈希会很容易,因此使用 hashedpassword 和 userid 会增加安全性,但是 cookie 欺骗呢?我基本上把所有基本信息都留给了客户端。

你怎么看?

更新 #1

这些 cookie 的内容就是我认为它们包含的内容。我不确定。 当然,如果调用 cookie ngivbpassword 并包含哈希,我猜是 hashedpassword。可能是密码+盐。

我主要担心这些解决方案在受到 cookie 欺骗 攻击时会提供大量信息。

更新 #2 这个问题不想批评这些特定软件的工作方式,但是,通过这些答案,我只想了解更多关于在网络环境中保护软件的信息。

【问题讨论】:

ngivbpassword 是密码的哈希值??真的吗?!在每个加密请求中发送您的密码哈希是个坏主意... 是的,这是我的:P cb17eee800v1361cee7985d731673c8g @shfx:实际上是一个哈希值。我更新了我的问题,因为可能不清楚这些是我的假设。 除了学习目的之外,例如在这个例子中,您应该尽可能重用现有的身份验证框架,它通常包括一个安全“记住我”的实现。例如,看看github.com/delight-im/php-Auth,它既与框架无关,又与数据库无关。 【参考方案1】:

会话不是持久的。 Cookie 是。

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

更新 #2:

是的,这是一个记住我的功能,我是 问他们为什么这样做 方式

好的...您如何实现“记住我”功能?您显然需要使用 cookie,我认为这很清楚。现在,您存储什么?

最简单的方法是以明文形式存储用户和密码并执行常规身份验证。这是您可以使用的最不安全的机制之一,但有些网站实际上就是这样做的。

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

第三种方法是保存一个带有“记住”会话的数据库表,用一个长的唯一字符串标识每个会话,并将这样的字符串存储在 cookie 中。字符串可以是随机的,也可以是计算出来的,当然,随机性的优点是即使你知道算法也无法猜出字符串。

可以通过在服务器中存储日期、IP 地址和其他数据来实现进一步的安全性。

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

更新 #3:

这些cookies的内容是什么 我认为它们包含。我不知道 关于它。当然如果调用 cookie ngivbpassword 并包含一个哈希值,我的 猜测是哈希密码。大概是吧 可能是密码+盐。[...]我的主要 关注的是这些解决方案 很多信息下时 cookie 欺骗攻击。

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

他们是否存储了加盐密码或只是一个名称,我不知道。

【讨论】:

也许我的问题不清楚。我没有问他们为什么一般都使用cookies。我问过cookie配置。为什么他们使用散列会话和散列密码和用户 ID。为什么要这么做。 是的,这是一个记住我的功能,我在问他们为什么要这样做。 因为他们做错了。您可以通过在服务器上的会话 cookie 和会话表上设置 TTL 来控制会话 TTL。 我已经更新了我的答案。每次我这样做时,你都会回复说你已经知道了。最好事先了解您已经知道的内容;-) 我也更新了我的问题,所以我希望现在清楚我在寻找什么:)【参考方案2】:

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

【讨论】:

只是一个整数。不,我不会建造一个。但是我正在攻读计算机工程硕士学位,并且我上学期的一部分时间都在学习安全问题,所以我很自然地要理解为什么 vB 会“过度使用”cookie 来处理身份验证。 首先,我不知道 vB 是如何使用这个 cookie 的。我很想进一步讨论这个话题,因为它是我最感兴趣的,但我正在打电话。我有一个名为 uFlex 的开源 PHP 用户身份验证类项目,我在其中使用内置编码器为自动登录创建单个哈希,其中包含密码哈希和编码用户 ID。【参考方案3】:

Cookie 应该尽可能少地包含有关您在服务器上的身份的信息。

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

在 cookie 中保存密码哈希是一个安全问题。你应该避免这种情况。

最后 4 个 cookie 来自谷歌广告。

PS。无论如何,大多数公告板都不是很好的软件。

【讨论】:

我已经更新了我的问题。我更好地解释了哈希密码的事情。我用散列表示加密但不清楚。 @dierre 加密确实与散列不同,但您已经明白了。那个Master到底怎么样了?抱歉 2 年半后的回答,只是漫无目的地参加了这个有趣的讨论:)【参考方案4】:

发生这种情况是因为会话和登录 cookie 可能具有不同的生命周期。

想象一下每天拥有数百万用户的网站。该网站不会将您的会话存储一年,只是为了让您在下次回来时重新登录。 他们为此使用登录 cookie。

这些 cookie 也称为记住我的 cookie。

【讨论】:

基本上你的意思是:我检查会话,如果会话过期然后我检查哈希密码和你的用户ID。如果他们匹配我的系统将登录你。 @Vitaly Polonetsky:这不是有点不安全吗?我的哈希密码在我的电脑上。 @dierr 在您提出的情况下 - 是的。一般来说,哈希将包含其他信息,这将使猜测您的密码成为一项非常困难的任务,例如,服务器可以哈希 [用户名]|[密码]|[关于您的其他常量信息]|[服务器硬编码常量] 并检查那个。 @Vitaly Polonetsky:嗯,可能是密码+盐,我不确定。 最安全的方法是让 cookie 完全随机,限制其路径,使用 HTTPS 并针对 IP 地址和其他参数执行一些服务器端安全检查。

以上是关于使用更多 cookie 而不仅仅是会话哈希进行身份验证的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用BASIC身份验证创建会话

使用 cookie/会话进行移动应用程序身份验证?

通过 Okta 进行身份验证后,会话 cookie 不会发送到 Spring Boot 应用程序

Cookie 会话身份验证是如何工作的?

如何检查用户是不是通过 Laravel 上的 cookie 会话进行身份验证?

使用带有令牌而不是 Cookie 的 Django 会话框架?