【问题标题】:PHP storing password in cookiePHP在cookie中存储密码
【发布时间】:2011-03-08 13:10:50
【问题描述】:

是否有一种相对安全的方法可以将密码存储在 cookie 中的浏览器 cookie(用于记住登录信息)中,而无需在数据库中为哈希创建额外的列? 谢谢。

【问题讨论】:

  • 所以如果 cookie 被删除,他们就失去了身份验证的能力?
  • 嗯,数据库会更好,但如果你像亚当说的那样做,那是可以忍受的......
  • @Shango - 为什么会这样?
  • cookie 也必须通过 https 发送,否则有人可以通过重放攻击进行身份验证
  • @Shango:如果用户希望记住他的密码,那么我想我应该将其存储在 cookie 中。当然如果cookie被删除,用户需要重新登录。

标签: php mysql


【解决方案1】:

您应该永远不要在您的数据库中存储纯文本甚至可解密的密码,除非已经生成它们并且用户不能输入自定义的!

最常见的方法是将密码的哈希值存储在数据库中的 cookie 中。但是,这允许任何人只需知道哈希即可登录 - 无需访问原始密码。所以不要走那条路,即使它显然是最简单的。

一种安全的方法是在数据库中存储一个随机的、唯一的“登录哈希”,并在 cookie 中设置此哈希和用户 ID。这不仅会使密码哈希对登录无用,而且还允许您创建“到处注销”功能。

【讨论】:

  • 正如我所说,这是最常见的方式,但不鼓励。
  • 另一种常见的方法是使用会话cookie。这提供了足够的间接性,因为它本身就是一个随机的唯一哈希。
  • 这很少用于“保持登录”之类的功能。
【解决方案2】:

在 cookie 中存储密码的加盐哈希

$salt = 'snfcikkfbnvekrew';
$cookie_value = md5($salt . $password);

【讨论】:

  • 并且可能对加盐密码进行两次或更多次哈希处理。
  • 并使用特定于用户的盐 - 尽管这需要数据库中的另一列
  • 虽然我不会说它是安全的......当然,你将无法找到密码,但如果有人拿到了 cookie,他们就会从门进来.会话 ID 至少是上下文相关的、超时的、冗余的……这可能会永久存在。
  • @#user-specific-salt:如果您使用用户 ID 或他的电子邮件地址,则不会(通常人们在更改电子邮件地址时需要输入密码,因此更新密码哈希不会成为问题本例)
  • MD5 不再安全。改用 SHA-256
【解决方案3】:

在 cookie 中存储密码或密码表示是一个非常糟糕的主意。当然,您可以保护 cookie,这样就无法读取密码,但如果 cookie 被拦截,其他人可以设置该 cookie,在更改密码之前给予他们前一个用户的全部权限。

通过直接机器访问,即使使用 HTTPS,也有可能窃取 cookie,然后在不知道密码值的情况下再次窃取一个人的完全访问权限,直到他们更改密码为止。

也许可以通过一些晦涩的时间特定散列方法安全地执行此操作,但我的建议是根本不要这样做。请改用会话,并尝试存储内部标识符而不是外部标识符。如果会话被破坏,后果仍然很严重,但通常不会那么严重,因为会话将过期,并且会话很适合其他形式的安全性(IP 锁定、请求排序等)。

【讨论】:

    【解决方案4】:

    简短的回答:永远不要将密码存储在 cookie 中,或者 - 如果未加盐 - 任何地方。不。在您的场景中,JSON web tokens (JWT) 可用于在客户端存储授权。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-11
      • 2010-12-03
      • 2016-12-01
      • 2011-01-07
      • 1970-01-01
      • 2016-06-02
      • 2010-12-06
      • 2011-08-13
      相关资源
      最近更新 更多