【问题标题】:Storing user's password for web application in client-side JavaScript - is this secure?在客户端 JavaScript 中存储 Web 应用程序的用户密码 - 这安全吗?
【发布时间】:2015-03-02 09:31:19
【问题描述】:

TL;DR - 将 Web 应用程序的用户登录密码存储在 JS 内存中,用于客户端加密用户数据:是还是不是?


我正在开发一个网络应用程序,用户可以在其中将笔记存储在云中。用户有密码才能登录。 此外,用户可以选择使用密码来加密笔记。笔记加密存储在云端,这意味着只有用户可以解密它们(如果密码丢失,笔记也会丢失)。

为方便用户,最好使用相同的密码登录帐户和加密笔记,并且在登录时将该密码存储在内存中的 JS 变量中,这样他们就不必重新输入密码每次应用程序需要加密或解密任何内容时(例如,如果他们更新笔记)。

这不安全吗?是的,可以访问用户机器的攻击者可以进行内存转储,或在(丑化的)JS 中插入断点等,并获取密码。但是可以访问用户机器的攻击者无论如何都可以这样做:为了登录,必须在我的应用程序的 JS 中以纯文本形式访问用户密码。

所以对我来说这似乎没问题 - 没有比 存储它更不安全。想法?

【问题讨论】:

    标签: javascript security encryption web-applications passwords


    【解决方案1】:

    是的,JavaScript 变量将受到同源策略的保护,防止其他域访问此数据。

    考虑将密码的加盐哈希存储为 JavaScript 变量,然后使用此哈希加密和解密来自云端的数据。这将防止本地攻击者查询其他人计算机上的本地变量以获取密码(例如,他们在喝咖啡时将屏幕解锁)。作为涉及窃取会话的攻击(这在无人看管的计算机上很容易做到),这是一个稍高的风险,因为密码可能已在其他站点上重复使用。您不希望您的网站成为攻击者访问其他用户的 Gmail、银行帐户、Facebook、Twitter 等的弱点。

    还要考虑key stretching 以使您的加密密钥“足够强大”。由于加密密钥是密码(称为基于密码的加密),这需要派生至少 128 位熵的密钥,这比您的普通用户密码所包含的要多。

    设计中需要考虑的其他事项:

    • 使用 TLS 保护通过 HTTPS 进行的所有通信。
    • 对于任何会话 cookie,如果可能,请设置安全标志和仅 HTTP 标志。
    • 使用 HSTS 确保来自重复用户的未来连接仅使用 HTTPS。

    【讨论】:

      【解决方案2】:

      只有使用 SSL/TLS 才安全,否则基于网络的攻击者可能会使用中间人攻击来更改客户端 JavaScript 代码,从而将密码直接发送给攻击者包括所有笔记。

      如果你有这个并且可以有效地阻止攻击者添加更多的 JavaScript(例如通过 XSS),你应该没问题。

      【讨论】:

      • 好点。 Web 应用程序通过 HTTPS 提供服务,因此已得到妥善处理。
      【解决方案3】:

      如果只有用户可以访问自己的密码,那应该没问题。但是,如果云不安全(如您所说,它是客户端),我认为这不是最好的。您应该改用服务器端密码系统。我是一名全职白帽黑客,任何客户端都可以很容易地被盗。如果您存储的只是笔记而不是信用卡信息,那应该没问题。

      【讨论】:

      • 用户可能会在他们的笔记中存储信用卡或任何东西(至少我愿意),而且我通常希望事情得到适当的保护。这个想法不是在服务器端进行。只有用户/客户端才能访问注释,例如 SpiderOak:spideroak.com/zero-knowledge
      猜你喜欢
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2015-04-20
      • 2013-11-02
      相关资源
      最近更新 更多