将密码安全地存储在数据库中

Storing passwords safely in a database

我想开发自己的密码管理器,因为所有工具都不具备我需要的功能。 ;)

我现在的问题是:

当我需要以纯文本形式再次解密密码时,在数据库中存储密码的安全好方法是什么?

如果你想安全地存储密码,你应该考虑 "hashing" 密码,也许加盐。考虑阅读 this Wikipedia article, which covers hash and salt.

但是如果您需要恢复原始文本,您将需要 encrypt/decrypt 密码的密钥。这意味着您必须将密钥保存在代码中的某个位置,或者至少您的系统能够以某种方式恢复密钥。如果攻击者可以访问密钥的位置或您的应用程序代码以及加密的密码,您最终可能会盗取密码!

无论如何,你需要一个问题的答案:你可以查找simmetric 或asimmetric cryptography,这取决于你的需要。例如,您可以向上循环 AES,这需要 encryption/decryption 的键(显然还有 original/encrypted 文本)。您没有指定编程语言,但您可以找到很多库来执行此操作!

使用现有的、可信的实现通常是个好主意。密码学是一个广泛而复杂的领域,它需要大量的知识来设计和实现安全的东西。一般来说,这意味着:坚持 a) 常用和 b) 尚未失效的现有算法。另外,不要自己实现算法,而是尽可能使用现有的、经过审查的实现。搞砸太容易了,即使是专家也是如此(cf. Debian weak key debacle)。

既然你希望能够再次获得明文,那么哈希函数不是一个选项。这给您留下了对称和非对称加密。非对称加密使用不同的密钥进行加密和解密,这并不是您真正想要的密码管理器。所以对称加密可能是要走的路。但这仍然会给您留下大量不同的算法(AES、Blowfish 和 Serpent 仅举几例)。

选择算法后,您仍然需要对数据库进行加密和解密,最好以快速和安全的方式进行。与其自己实施,不如坚持使用经过验证的解决方案。 enpass password manager uses SQLCipher 加密一个sqlite数据库。 SQLCipher有一个Java API,所以在Scala中使用它应该不会太复杂。

您提到目标是将密码管理器构建为云服务。首先,我想说,如果您想在生产环境中构建它,您需要 真正 良好的安全咨询。此外,在部署之前,您需要让安全公司对其进行审核。一般来说,我建议根本不要去那里。

注意:如果您将此作为一个业余项目来做,并且只冒危及您自己安全的风险,那就去做吧。我也曾经为自己搭建过这样一个系统(虽然我从来没用过 :P)。

最安全的密码存储方式是将加密形式存储在服务器上。最重要的是,将密钥存储在用户的设备上并在那里执行所有 encryption/decryption。从理论上讲,只要密钥留在设备上,即使服务器被黑客入侵,密码也是安全的。

实际上这是一个难题。你必须考虑使用第二个因素进行解密(密钥文件、密码,也许是 NFC 令牌)、备份、访问控制、密钥撤销、重新加密、防止数据泄露(键盘记录器、屏幕截图、剪贴板、边信道攻击),等等。所有这些因素使得这些方案几乎不可能既可用又安全。