【问题标题】:Storing passwords safely in a database将密码安全地存储在数据库中
【发布时间】:2017-07-31 14:45:32
【问题描述】:

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

我现在的问题是:

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

【问题讨论】:

标签: security passwords password-encryption


【解决方案1】:

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

注意:如果您将其作为一个爱好项目并且只会冒着损害您自己的安全的风险,那就去做吧。我也曾经为自己构建过这样的系统(虽然我从未使用过:P)。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 推荐 Blowfish 或 Serpent 代替 AES 的可能理由是什么?请注意,Blowfish 的作者已声明他不使用它并使用 AES。否则一个很好的答案。
    • 我不推荐任何替代 AES 的方法,但我也不推荐 AES 替代 Serpent(与河豚相比,我可能会使用推荐 AES,但与双鱼相比不推荐)。只要两者都没有被破坏,我会认为它们同样安全。如果你想真正确定你仍然可以将所有这些算法嵌套在一起:使用 Serpent 加密你的密码,然后使用 Twofish 加密结果,然后使用 AES 加密结果。这就是 Veracrypt 正在做的事情,为了破解它,您需要破解所有三个加密层。
    【解决方案3】:

    如果你想安全地存储密码,你应该考虑“散列”密码,也许用盐。考虑阅读this Wikipedia article, which covers hash and salt。

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

    无论如何,您需要回答您的问题:您可以查找 simmetric 或 asimmetric 密码学,这取决于您的需要。例如,您可以循环查找AES,它需要一个用于加密/解密的密钥(显然还有原始/加密文本)。您没有指定一种编程语言,但您可以找到很多这样的库!

    【讨论】:

    • 我想在 scala 中开发,对此感到抱歉。你可能对我有什么暗示吗?
    • 当保存密码验证器时,仅使用哈希函数是不够的,仅添加盐对提高安全性无济于事。
    • Zaph,请给出你对这个问题的完整答案,而不是对所有答案投反对票......
    • 答案存在的问题: 1. OP 明确指出需要恢复密码,因此密码验证器不是解决方案。 2. 在需要密码验证器的情况下,它们需要安全以保护用户。 3. OP的使用不需要非对称,对称加密是合适的。 4. 建议:重新设计答案以删除不合规的部分,这值得一票。
    • OT:我有事情要做。和平
    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    相关资源
    最近更新 更多