在客户端存储 Web 应用程序的用户密码 JavaScript - 这安全吗?

Storing user's password for web application in client-side JavaScript - is this secure?

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


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

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

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

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

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

只有使用 SSL/TLS 才安全,否则基于网络的攻击者可能会使用中间人攻击以某种方式更改客户端 JavaScript 代码将密码直接发送给攻击者,包括所有注释。

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

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

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

还可以考虑 key stretching 以使您的加密密钥 "strong enough"。由于加密密钥是密码(称为Password Based Encryption),这需要推导出至少128位熵的密钥,这比一般用户的密码包含的要多。

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

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