在会话中存储密码哈希。好主意?

时间:2015-05-28 14:09:38

标签: php apache security session

总结问题

在会话中有什么参数可以保存密码哈希?

在登录时在会话中存储密码哈希值(在数据库中),并在每次访问时根据数据库哈希对其进行验证,以便自动使密码更改的所有会话无效。

我的想法

到目前为止,这是我对这个问题的看法。

  • 假设两个人合法地共享一个帐户,它会(大部分)阻止一种竞争条件,即在另一个登录时更改密码。混淆只会发生一次而不是两次。
  • 如果发现恶意攻击,合法用户可以在早期检测到的情况下踢出攻击者。

N

  • 如果人员A在B人员更改密码后立即提交表格,则可能存在数据。
  • 假设发生恶意攻击,攻击者可以踢出合法用户。

中性

  • 没有真正的性能影响。 (编辑:因为我出于其他原因加载了每个页面加载的用户信息。)
  • 安全问题几乎不存在。如果有人可以访问服务器,那么访问具有 all 哈希值的数据库的工作量与访问会话存储的工作量相当,后者具有登录用户的哈希值。

答案和评论

我不想在这里开始主观讨论。我想收集(尽可能客观)该主题的利弊。我还没有考虑过什么?

编辑:

澄清:使所有会话无效(除了用于更改密码的会话)的想法来自于“如果一个人更改密码而没有告诉某些其他人有这样的原因,那么他们应该立即松开访问。“,假设没有恶意用户(这将是一个奇妙的世界......)。

2 个答案:

答案 0 :(得分:6)

  1. 关于同时更改密码的方案听起来非常罕见,而不是构建会话体系结构的核心前提。使用乐观锁定和其他并发解决方案也可以更好地防止这种情况发生。
  2. 当明确更改密码时,您可以使会话无效,您不需要在会话中存储密码。如果您使用数据库来存储会话(最好是像Redis或memcached这样的内存数据库),这是微不足道的,但使用标准的基于PHP文件的会话也不是不可能的。当密码更改完成后,只需主动核对给定用户的所有活动会话。
  3. 密码是一个秘密,应该尽可能地保持流通。哈希只是这个秘密的影子,但即便如此,你应该保守秘密。将它存储在会话中比将其完全保留在数据库中时更容易泄漏。
  4. 对每个页面加载进行数据库查找会对性能产生影响。

答案 1 :(得分:1)

<强>建议:

您可以生成一个&#34;令牌,而不是在会话中存储密码哈希值,在这里您可以生成随机的字符和数字序列,并将其存储在会话中并为其提供到期时间。

假设您和我共享一个密码为cow123的帐户。当我登录时,我将收到令牌$ 124abc和你的令牌%xyz222,这两个令牌都与密码cow123相关。

现在您将密码cow123更改为cat321。

因为我的令牌仍然有效,所以我什么都不会发生(你可以创建一个表来保存有效期限列的有效令牌)