如何将密码存储在数据库中以便可以检索?

信息安全 加密 密码学 密码管理
2021-08-20 22:34:10

我正在开发一个密码管理器网络应用程序。这只是为了好玩:我不会泄露任何人的密码。

我的想法是使用散列+加盐,这就是我为主密码所做的。但后来我意识到我必须检索帐户的密码才能使用它们(我觉得有点愚蠢),所以哈希不是一种选择。

显然对称加密在这种情况下是没有用的,因为我们在解密密钥上也有同样的问题。非对称加密可能是一种选择,但不是很实用(用户拥有私钥,每次他想获得密码时都必须使用:不实用)。

我不知道如何使用这些加密工具(或其他)来解决这个问题。

摘要:我必须将密码存储在数据库中,但我必须能够以纯文本形式检索它们。

2个回答

密码管理器的正常机制是拥有某种“主密钥”并使用该密钥(对称地)加密数据。在您的情况下,主密钥是通过适当的密码散列从主密码派生而来的(在这种情况下,它变成了基于密码的密钥派生)。因此,使用 bcrypt 或 PBKDF2 将用户的主密码转换为密钥K ,并使用K加密该用户的所有数据

将其作为一个Web应用程序是值得怀疑的。即使您在 JavaScript 中执行所有客户端操作,该 JavaScript 仍然是服务器发送的代码,以及查看所有用户的所有密码的代码,因此服务器成为一个非常敏感和多汁的目标(如果服务器受到敌对控制,这将变成一场密码盗窃狂欢)。

您可以看到银行可能如何做到这一点,但安全性确实取决于最薄弱的环节,而且我个人会更加关注网络安全(XSS、CSRF 等)。

如果前端负责解密,这样主密钥和明文密码都不会存在于服务器内存或网络中,那就更好了。但是,这限制了您可以放入后端数据库的技巧数量。