我正在建立一个网站,允许用户创建帐户并访问该网站的内容。我不希望用户在每次访问该站点时都登录,因此我计划将用户名和密码存储在 cookie 中——但是,我听说这是一种不好的做法,即使密码是经过哈希处理的饼干。
我应该遵循哪些“最佳实践”才能在访问我的网站之间安全地记住用户凭据?
我正在建立一个网站,允许用户创建帐户并访问该网站的内容。我不希望用户在每次访问该站点时都登录,因此我计划将用户名和密码存储在 cookie 中——但是,我听说这是一种不好的做法,即使密码是经过哈希处理的饼干。
我应该遵循哪些“最佳实践”才能在访问我的网站之间安全地记住用户凭据?
永远不要那样做。公开乱扔密码。
最安全的方法:
将用户名存储在数据库中,在同一行中存储随机生成的盐值,在同一行中存储包含盐的密码的哈希校验和。将另一个表用于引用具有用户凭据的表的会话。当用户登录时,您可以在会话表中插入您希望会话到期的日期(例如 15 天后)。将会话 ID 存储在 cookie 中。
下次用户登录时,您将获得密码,为用户添加盐,获取哈希,将其与您拥有的进行比较。如果它们匹配,则通过在会话表中插入一行并在 cookie 中发送会话 ID 来打开会话。您可以通过此cookie检查用户是否已登录以及是哪个用户。
编辑:
这种方法是大多数网站上最流行的方法。它在安全和实用之间取得了很好的平衡。
您不只是对会话 ID 使用自动增量值。您可以使用一些难以重复的复杂校验和来实现。例如连接用户名、时间戳、盐、另一个随机盐,并从中生成一个 md5 或 sha 校验和。
为了在网站/服务中实现涉及用户凭据的功能,客户端和服务器之间通常会进行一些与凭据相关的数据交换。这会将数据暴露给中间攻击者等。此外,cookie 存储在用户硬盘中。没有任何方法可以 100% 安全。
如果您想要额外的安全性,您可以让您的网站通过 https。这将防止人们使用中间人攻击窃取 cookie 和密码。
笔记:
将 IP 地址混入其中并不是一个好主意。大多数情况下,多个客户端将通过 NAT 等来自同一个 IP 地址。
您不需要存储密码,只需存储您的应用程序可以解释为他们的用户的标识符。
您需要注意的事项:
处理这些问题的一种可能解决方案是为每个用户创建一个一次性密钥,该密钥在他们下次使用应用程序时更改。
您可能永远无法完全安全地记住用户,因此只有在不涉及敏感数据的情况下才应该使用它。
任何形式的密码都不应该存储在 cookie 中。Cookie 很容易被盗。
一些浏览器已经支持保存密码。为什么不让用户使用它呢?
在 cookie 中存储用户名的哈希可以提供这种“记住我”的功能。
但是,对于系统的敏感区域,您需要知道用户在缓存凭据上进入系统,以便您可以在让他们造成任何实际损害之前提供用户名/密码提示。这可以作为基于会话的标志举行。