TL; DR - 在JS的内存中存储用户的Web应用程序登录密码,用于客户端加密用户的数据:是或不是?
我正在开发一个用户可以在云端存储笔记的Web应用程序。用户有密码登录。 此外,用户可以选择使用密码加密笔记。这些注释以加密方式存储在云端,这意味着只有用户才能对其进行解密(如果密码丢失,注释将丢失)。
为了方便用户,最好使用相同的密码进行帐户登录和笔记加密,并在登录时将该密码存储在JS变量的内存中,这样他们就不必重新输入每次应用程序需要加密或解密任何内容时(例如,如果他们更新注释),他们的密码。
这是不安全的吗?是的,可以访问用户计算机的攻击者可以进行内存转储,或者将断点插入(uglified)JS等,并获取密码。但是,有权访问用户计算机的攻击者无论如何都可以这样做:为了完全登录,必须有一个点可以在我的应用程序中以纯文本形式访问用户的密码。 JS。所以对我来说似乎没关系 - 没有比不存储它更不安全。想法?
答案 0 :(得分:3)
是的,JavaScript变量将受同源策略保护,阻止其他域访问此数据。
考虑将密码的盐渍哈希存储为JavaScript变量,然后使用此哈希加密和解密来自云的数据。这样可以防止本地攻击者在其他人的计算机上查询本地变量以获取密码(比如他们在拿咖啡时将屏幕解锁)。这是一种稍高的风险,因为攻击涉及窃取会话(这在无人值守的计算机上同样容易),因为密码可能已在其他站点上重复使用。您不希望自己的网站成为攻击的弱点,可以访问其他用户的Gmail,银行帐户,Facebook,Twitter等。
还要考虑key stretching,以使您的加密密钥“足够强大”。由于加密密钥是密码(称为基于密码的加密),因此需要导出至少128位熵的密钥,这比您的普通用户密码所包含的密钥要多。
您的设计需要考虑的其他事项:
答案 1 :(得分:1)
只有使用SSL / TLS才能安全,因为否则基于网络的攻击者可能会使用中间人攻击以直接向攻击者发送密码的方式更改客户端JavaScript代码包括所有笔记。
如果你有这个并且可以有效地阻止攻击者添加更多JavaScript(例如通过XSS),你应该没问题。
答案 2 :(得分:0)
如果只有用户可以访问自己的密码,那么应该没问题。但如果云不安全(正如你所说的那样是客户端),我认为这不是最好的。您应该使用服务器端密码系统。我是一名全职白帽黑客,任何客户端都很容易被盗。如果你要存储的都是笔记而不是信用卡信息,那就应该没问题了。