前端加密:在会话期间存储密码的位置?

3

目前我们正在开发一个小应用程序,其中存储了来自基于JS的图形编辑器(类似于此版本)的大量JSON数据在基于Rails的后端中。我们想允许用户加密(AES、RSA或其他方式)存储数据,在这种情况下,我们作为应用程序维护者无法解密存储在数据库中的数据 - 前提是密码足够强壮。没有用户帐户管理,仅此而已。人们只能通过秘密链接创建和编辑他们的图形,没有更多的权限。

在编辑或保存当前状态之前,需要使用密码来加密/解密从DB中出入的图形。现在,我们面临以下概念问题:

  1. 整个会话期间是否要保存密码?如果不保存,则每次刷新浏览器或想将当前图形状态保存到数据库中时,用户都需要输入密码。这很不方便...

  2. 如果从软件工程角度考虑,这是可行的:一般情况下,这种信息存储在哪里?除了 cookie 以外,有哪些选项?

  3. 如果是这样,我们是否需要存储明文密码,还是有一种方法可以加密密码以使在 cookie 被盗的情况下攻击者更难获取密码?


1
如果可能的话,不要存储密码。相反,存储授权令牌。搜索密码安全性,或更好的做法是使用可信赖的第三方进行身份验证。 - evolutionxbox
嗨,evolutionxbox,由于我们没有会计系统,这不是关于身份验证的问题。而是关于存储用于加密/解密内容的口令短语。 - A. Neumann
1
会计系统?当然是关于身份验证的,这就是密码的作用。我建议您在网上查找安全身份验证的基础知识,例如不要存储密码。 - evolutionxbox
1个回答

2
很多时候,安全性是需要平衡的,这就是一个这样的例子。
考虑到你的需求(没有用户管理后端的Web应用程序),我认为你有两个选择:
1. 不存储密码,但用户体验会更差。正如你所说,任何刷新都需要用户重新输入密码。
2. 在客户端存储密码(见下文),一个合理的地方是SessionStorage。这样做很舒适,也可以像其他用户期望的那样工作:它“只是工作”,直到用户关闭浏览器,但之后就不行了。显然,密码以某种形式存在于浏览器中,这是非常实际的风险。它对任何JavaScript都可用(考虑XSS),你无法防止它被缓存到磁盘(无论你做什么,考虑休眠电脑等)。一般来说,这是一种反模式,但并不简单。安全决策应该基于风险。
这是你需要根据你的用例特定的风险做出的决策。数据是什么,攻击的可能性有多大(你做了什么来确保你的代码是安全的),影响有多大(如果密码丢失,你将失去什么,包括声誉的损失)。此外,如果用户必须一直输入密码,他们是否真的会讨厌这个产品?只有你能回答这些问题。
在客户端加密密码没有意义,攻击者将拥有解密所需的所有信息。但是,哈希它可能会有一些好处,而且可能会有点令人惊讶。如果你实际上不存储密码,而是某种转换,那么无论你存储什么都将成为密码,因此看起来没有意义。之所以仍然有意义,是因为人们倾向于重复使用密码,因此如果你从密码中派生一个密钥,比如PBKDF2,并将其存储为密钥,这样更好,攻击者无法从浏览器中获得实际密码(但如果有妥协,例如XSS,则仍然可以访问数据)。
因此,如果(并且仅当)你接受上述存储和JavaScript加密相关的风险,你应该:
1. 使用适当的密钥派生函数(如pbkdf2)从用户密码中派生密钥
2. 将该密钥作为SessionStorage中的加密密钥进行存储

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接