在会话中存储用户凭证的安全方式

时间:2012-09-20 09:22:53

标签: session credentials

免责声明:在点击-1按钮之前,先想一下“不要存储用户的凭据,用盐+辣椒哈希他们笨蛋!”,请阅读以下内容:< / p>

我正在开发一个项目,该项目将向用户询问其数据库的凭据(登录名/密码)。这些凭据将针对数据库进行尝试,如果连接成功,我将“保持”他们按照用户的要求对数据库进行一些工作(创建表,更改行,做一个SELECT,等等。)

这意味着,每次用户执行某些操作时,我都会在执行请求之前重新连接到数据库=&gt;我无法对凭据进行哈希处理,因为它们对后续请求无用。

如果你愿意,就像 PhpMyAdmin

所以我想出了各种各样的可能性,但每个都有缺陷。我正在寻求你的帮助,知道哪一个更好。

  1. 只需使用带有登录名/密码的会话cookie 即可。但只允许通过HTTPS使用:这是最简单的实现方式。我看到的唯一缺点是,如果客户端有XSS,则可以检索凭据。
  2. 相同的会话Cookie,但使用AES 加密登录/密码。这就是我相信PhpMyAdmin所使用的内容。我也可以通过仅允许HTTPS来进一步发展。
  3. 将凭证明确存储在本地会话存储(sqlite中的session.db)中,并使用令牌为将使用给定令牌+浏览器详细信息检索的客户端。缺点:如果攻击者访问session.db文件,他将能够读取尚未从文件中删除的会话。我不认为加密它们会有用,因为如果他可以访问session.db,他当然也可以访问用于加密它们的SECRET_KEY。
  4. 你怎么看?你会做什么?

    感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我建议不要使用1.或2.,原因如下:

  • 凭据对客户端无用
  • 每次请求(以任何形式)都通过电汇发送凭证不是一个好主意

所以保留的是版本3的变体,将其存储在会话中。这有一个重要属性:如果您的会话存储不安全,这意味着您的服务器不安全。游戏结束。

为了防止对session.db的攻击,您可以在应用中使用硬编码的密钥库。此密钥库使用会话令牌进行加密,然后进行散列,结果将用作加密和解密客户端凭据的密钥。这样,攻击者就需要破坏session.db和你的应用程序(以获得密钥库)。如果他能够做到这一点,没有什么能帮到你。