不清楚您的具体需求,因此很难提供实现建议。
像PGP和S/MIME这样的标准会使用新的对称密钥加密每个消息。然后,这些密钥会为消息的每个接收者加密。这样,每个接收者都会得到相同的密文,而不是为每个接收者复制消息(可能非常大),只有密钥(较小)被复制,但是对于每个接收者进行了不同的加密。
也许您可以在这里做类似的事情,使用用户的密码加密密钥,并使用您的公钥加密另一个副本。如果用户忘记了他们的密码,您可以使用您的私钥(在适当的备份身份验证之后)为他们恢复消息。
这似乎是在寻找问题的解决方案。 当你有两个(或更多)具有相互通信数据的利益相关方时,公钥密码技术非常有用。 这些参与者可以是真实的(人)或功能性的(系统组件),但没有两个参与者,就没有必要有单独的公钥和私钥。
不提供重置密码功能-如果他们忘记了密码,则被锁定。
生成新的安全主密钥并使用此主密钥加密和哈希用户的密钥,并将密文和哈希结果存储在数据库中。然后通过将其添加到用户下载的文件中,向用户发送电子邮件或在屏幕上显示安全主密钥来使用户知道安全密钥。要重置密码,用户必须输入此主密钥,然后对其进行哈希处理并进行比较,如果匹配,则解密数据库中的用户密钥。
在注册时要求用户提供2个安全问题和答案; 对答案进行哈希处理,并将问题和答案哈希存储在数据库中。第二个答案用作加密用户密钥的主密钥。要接收密码重置请求电子邮件,用户必须正确回答第一个问题。一旦他们单击电子邮件中的链接,网页就会询问第二个问题,如果这是正确的,并且查询字符串参数值有效,则使用第二个问题的答案来解密用户的密钥。
使用应用程序全局主密钥(可能存储在Web / UI应用程序中),并使用此密钥加密和存储用户的密钥。通过密码重置电子邮件流程验证用户后,使用应用程序全局主密钥解密用户的密钥,然后使用其新密码重新加密。
总之,每个选项的优点如下:
这是最安全的选择,如果要保持数据加密,则可能是唯一的选择。但是,在现实世界中,人们忘记密码就像太阳升起一样肯定,不提供重置密码功能可能是一个糟糕的商业决策。
这是安全的,因为主密钥不存储在前端或数据库中,因此如果平台被攻击,则需要一些重大的努力才能解密数据。但是,缺点是用户仍然可能会丢失其主密钥。
这里的弱点是如果数据库遭到攻击,则可以研究问题的答案,然后用于解密用户的加密密钥。
这种方法将应用程序密钥留在堆栈中,如果您的平台被黑客攻击,则数据容易受到攻击。您唯一的保护措施是,如果数据库服务器被黑客攻击,则数据仍然是安全的。
与软件开发世界中的大多数事物一样,您需要考虑为实现目标而选择什么,并争取正确的平衡。
为什么要为每个用户使用不同的密钥?
如果选择一个密钥,处理起来会更容易。
将加密密钥存储在数据库之外。
您的应用程序仍然需要访问它,但拥有数据库转储的人将无法读取加密信息。
这样,您就可以使用任何用户密码来解密数据。