Language agnostic 在网站访问之间安全地存储凭据

Language agnostic 在网站访问之间安全地存储凭据,language-agnostic,password-storage,Language Agnostic,Password Storage,我正在建立一个网站,允许用户创建帐户和访问网站的内容。我不希望用户每次访问站点时都登录,所以我计划将用户名和密码存储在cookie中——然而,我听说这是一种不好的做法,即使密码在cookie中被散列 在访问我的网站之间,我应该遵循哪些“最佳实践”来安全地记住用户凭据?您不需要存储密码,只需要存储应用程序可以解释为他们的用户标识符 您需要注意的事项: 如果复制了cookie,另一个用户是否可以假装是该用户 用户不应该能够构造一个cookie来验证他们是否是另一个用户 处理这些问题的一个可能的解

我正在建立一个网站,允许用户创建帐户和访问网站的内容。我不希望用户每次访问站点时都登录,所以我计划将用户名和密码存储在cookie中——然而,我听说这是一种不好的做法,即使密码在cookie中被散列


在访问我的网站之间,我应该遵循哪些“最佳实践”来安全地记住用户凭据?

您不需要存储密码,只需要存储应用程序可以解释为他们的用户标识符

您需要注意的事项:

  • 如果复制了cookie,另一个用户是否可以假装是该用户
  • 用户不应该能够构造一个cookie来验证他们是否是另一个用户
处理这些问题的一个可能的解决方案是为每个用户创建一个一次性密钥,该密钥在他们下次使用应用程序时更改


您可能永远无法完全安全地记住用户,因此只有在不涉及敏感数据的情况下才应使用此功能。

将用户名哈希存储在cookie中可以提供此“记住我”功能


但是,对于系统的敏感区域,您需要知道用户是通过缓存凭据进入系统的,这样您就可以在让用户名/密码提示造成任何实际损坏之前提供用户名/密码提示。这可以作为基于会话的标志保存。

任何形式的密码都不应存储在cookie中。饼干很容易被盗


一些浏览器已经支持保存密码。为什么不让用户使用它呢?

永远不要这样做。在公开场合乱扔密码

最安全的方法:

在数据库中存储用户名,在同一行中存储随机生成的salt值,在同一行中存储密码(包括salt)的哈希校验和。将另一个表用于引用具有用户凭据的表的会话。当用户登录希望会话过期的日期(例如15天后)时,可以在会话表中插入。将会话id存储在cookie中

下次用户登录时,您将获得密码,为用户添加salt,计算哈希,并将其与您拥有的进行比较。如果它们匹配,则通过在会话表中插入一行并在cookie中发送会话id来打开会话。您可以通过此cookie检查用户是否已登录以及它是哪个用户

编辑:

这种方法在大多数网站上最为流行。它在安全性和实用性之间取得了很好的平衡

您不只是对会话id使用自动增量值,而是通过使用一些难以重复的复杂校验和来实现。例如,连接用户名、时间戳、salt和另一个随机salt,并从中生成md5或sha校验和

为了在网站/服务中实现涉及用户凭据的功能,客户机和服务器之间必须进行一些与凭据相关的数据交换。这将数据暴露在中间的AtACS等人中,另外Cookie被存储在用户硬盘中。没有一种方法是100%安全的

如果你想要额外的安全性,你可以让你的网站通过https。这将防止人们使用中间人攻击来窃取曲奇和密码。 注:


将IP地址包含在混合中并不是一个好主意。大多数情况下,多个客户端会通过NAT等来自同一IP地址。

-1,您可以使用客户端证书安全地标识经过身份验证的用户。如果我将会话ID存储在cookie中,则仍有可能有人窃取cookie,操纵自己的cookie,并假定我的一个用户的身份。如果我误解了,请纠正我。你是对的。如果你想要额外的安全性,你可以让你的网站通过https。这将阻止人们使用中间人攻击来窃取曲奇饼和密码。如果没有人检查证书,有一个潜在的机会来进行MITM攻击。@瓦西尔:让我说我正在开发一个简单的网站,比如留言板或博客,而不是一个在用户之间转移资金的网站。HTTPS是不合适的,未经适当净化的HTML比MITM攻击更令人担忧。对于这样一个站点,我如何在会话之间对用户进行身份验证?@Princess:与我描述的方法相同。如果要清理html,xss攻击比MITM更容易执行。