关于安全性:以纯文本形式在内存中短暂拥有用户密码是否安全?

Is it safe to briefly have a user's password in memory in plain text?

考虑到你通常登陆多大的网站,公司服务器在某个时间点以明文形式将你的密码保存在内存中。这是真的吗?安全吗?

这类似于大多数大型网站的登录方式:

  • 在浏览器中输入密码
  • 使用非对称加密公钥在浏览器中加密密码
  • 向网站发送密码
  • 使用非对称加密私钥解密密码
  • 使用单向哈希算法(和salt)哈希密码
  • 将哈希密码与数据库中的哈希密码进行比较
  • 如果哈希匹配,则成功登录。否则,登录失败。
  • 在步骤4和5之间查看

  • 使用非对称加密私钥解密密码

    4.5。简单地使用一些带有纯文本密码的服务器端变量

  • 使用单向哈希算法(和salt)哈希密码
  • 这意味着,尽管整个哈希方案是为了防止攻击者访问密码,即使服务器受到攻击,熟练的黑客也可以做到这一点。

    有什么我错过的吗?更重要的是,还有更安全的选择吗?


    是的,它是"安全的",因为内存中的内容都在服务器的内存中,不应该能够从外部读取。

    安全是引用的,因为一切都是相对的,风险水平取决于你感知到的威胁模型——也就是说,你试图防御什么威胁?

    广为宣传的HeartBleed错误允许攻击者以64kb的块从服务器内存中检索项目。然而,这里的策略是建立一个漏洞管理(修补过程),而不是围绕这些类型的问题进行编码。

    关于加密密码-这是你应该依靠https而不是用javascript在客户机上加密的东西。当它们到达您的服务器存储并使用慢速算法(如bcrypt、scrypt或pbkdf2)以哈希格式进行比较时。还可以使用标记有"仅安全"和"仅HTTP"标志的cookie,实施HSTS策略,并且应该能够很好地进行密码存储和传输。

    这里是CERT关于处理内存中敏感数据的建议。

    与您的问题最相关的部分是:

    • 禁用内存转储。
    • 不要在程序中存储超过使用时间的敏感数据。
    • 不要以明文形式(磁盘或内存)存储敏感数据。
    • 如果必须存储敏感数据,请首先对其进行加密。
    • 安全地从磁盘和内存中删除敏感数据。

    This means that while the whole hashing scheme is to prevent an
    attacker from gaining access to passwords EVEN IF the server is
    compromised, a skilled hacker could get at it anyway.

    记住,拥有一个安全的系统不仅意味着你需要有安全的编码实践和安全的基础设施。这是因为你永远不能拥有100%的安全性。这将丢失的一个难题是任何形式的入侵检测/预防(ID/IP)。这种观点认为系统在某个时刻会受到威胁,因此,与其试图阻止每种可能的攻击类型,不如检测它,允许您立即采取适当的行动。如果攻击者设法破坏了您的系统,并在登录过程中开始获取凭据,这将覆盖您。


    This is something like how most big sites have you log in

    实际上,我从未见过任何站点对客户端的密码进行加密。在客户机上进行加密,然后在服务器上对其进行解密,什么也得不到。这就是SSL证书的用途。在我的生活中,几乎所有我见过的站点都只需将密码以纯文本的形式发送到服务器,然后在那里散列(我们希望如此)。

    如果您试图阻止服务器在内存中使用纯文本密码,可以在客户端散列该密码,然后在服务器上散列该密码。请记住,当您在客户机上散列密码时,散列实际上就是密码。


    你说得对。但是远程攻击者必须更改代码。对于PHP,这很容易做到,但对于编译语言则不是这样。模糊的PHP代码也有一个地方来阻止攻击者的努力。

    有时,当攻击者是开发人员之一时,即使是编译或模糊的代码也无法停止攻击。

    请注意,当用于用户身份验证时,多方通信和零知识证明可能会以相同的方式被破坏。除了让攻击者很难侵入您的服务器之外,我认为没有其他选择。