如何为密码管理器实现重置密码

信息安全 密码管理 密码策略 隐写术
2021-09-04 06:18:07

我怎样才能最好地为密码管理器实现重置密码功能?我目前正在保存一个散列+加盐的主密码,它是用 PBKDF2 散列的,并用主密码本身加密密码,但是如果用户丢失了他的主密码,这意味着密码无法解密。

我考虑过保存使用主密码加密的密码版本和使用用户电子邮件加密的版本+用户创建帐户时生成的一些随机令牌,但这会安全吗?这样做时有什么最佳做法吗?

用户的电子邮件也仅作为散列存储。

因此,为了澄清我的问题,如果密码丢失,是否有恢复使用密码加密的数据的最佳做法?

编辑

我目前的想法是生成第二个密钥来加密所有密码,并通过用户可以存储在 USB 上的隐写术在图像中加密这个密钥,但是所有密码将在数据库中保存两次(两次都加密),所以我不不知道这是否有风险。

编辑 2

最终版本,在@A.Hersean 的回答的帮助下。

我将生成一个用于加密所有密码的密钥,并且该密钥本身可以使用密码和备份密码(保存在图像中)进行加密,然后将密钥的这两个加密保存到数据库中.

3个回答

要回答您的问题“所以为了澄清我的问题,如果密码丢失,是否有恢复使用密码加密的数据的最佳做法?”,最佳做法是在您丢失密码时不要恢复加密数据。因为加密的目的是在没有密码的情况下无法解密,否则会削弱您的加密方案。因此,您必须首先确保不要丢失密码,例如将密码写下来并放入保险箱。

对于您的问题“使用用户电子邮件加密的版本 + 用户创建帐户时生成的一些随机令牌,但这会安全吗?”,答案是否定的,那不安全。因为您必须保存令牌(以及电子邮件地址或其哈希),所以它与以明文形式保存密码相同。

如果您需要灵活性,请不要使用密码加密数据。使用随机生成的加密密钥加密您的数据,然后使用密码加密此密钥并以加密形式保存该密钥。然后,您可以使用其他密码加密密钥并将其也保存在其他地方(在保险库中)。请记住,由此产生的加密强度将是使用的最弱密码之一。

这本质上是@MarkoVodopija 回答的后续行动。密码恢复加密背后的基本原理只是将密码或密钥存储在安全的地方,因为只有后门或加密软件中的重大缺陷才能允许在没有密钥的情况下读取数据

根据您接受的安全性将导致不同的解决方案。除了 Marko 提出的建议之外,您还有:

  • 把它写在纸上,然后用密封的信封保存在物理保险箱中。它曾经是管理员密码的好习惯,而且它是一种真正的防弹方法......如果您可以信任安全密钥的所有所有者。
  • 与您信任的人分享 - 并相信他/她不会忘记它......但这更适合共享秘密,如果您认为您可以忘记它,为什么其他人也不能忘记它?
  • 在企业 Microsoft 网络中,用于加密文件夹的密钥通常使用所有者的私钥加密一次,然后使用网络管理员可访问的密钥加密一次,以允许系统管理员在员工不先离开的情况下解锁文件夹把一切都给别人——例如发生事故。

当您从用户密码派生密钥时,没有简单的方法可以重置密码功能。请参阅thisthis以获得众所周知的实现示例以及如何解决密码重置。

许多实现具有恢复密钥功能,以防万一主密钥丢失(或在您的情况下忘记)。BitLocker就是一个例子。

您可以考虑创建密码重置密钥并在注册时将其发送到用户电子邮件。但是,如果用户电子邮件被黑客入侵,这可能会受到损害。

其他选项是在两个或多个用户/管理员之间共享恢复密钥(例如使用Shamir 的秘密共享算法),因此在重置的情况下,需要多方来重置给定用户的密码。在Vault中进行了类似的操作

我相信没有任何特定的最佳实践,只有一些众所周知的实现。这完全取决于您的设计需求。