使用从密码派生的密钥加密的文件...如果用户忘记密码该怎么办?

时间:2014-05-03 16:19:43

标签: php encryption password-encryption

在我的服务器上,我有可以存储和加密文件的用户。

用户密码是SHA512哈希值,因此我无法对其进行反向/解密。 用户的文件是用我的数据库中加密的随机file_key加密的,了解文件的file_key的唯一方法是使用用户的密码来解密file_key。我这样做是因为每次用户更改密码时我都不想重新加密所有文件,而只是用用户的新密码重新加密file_key并重新存储它在数据库中。

  

生成密钥以加密用户的数据;称之为"内容   加密密钥。"从用户的密码中导出密钥;叫这个   "密钥加密密钥。"加密"内容加密密钥"使用   "密钥加密密钥。"存储加密密钥以及盐和   用于密钥派生的迭代次数。

     

如果他们更改了密码,请使用解密内容加密密钥   旧密码,并使用从新密钥派生的密钥对其进行重新加密   密码。你应该为新密码选择一个新的盐,然后制作   确保将它与新的加密密钥一起存储。

我开始想到一个小问题(大问题),事实上,如果用户忘记密码并要求重置密码,我将丢失所有加密文件,因为它不可能让我在没有原始密码的情况下访问加密文件..

是否有任何加密策略来处理用户忘记密码的可能性,因此,我可以解密文件?

2 个答案:

答案 0 :(得分:2)

很明显,密钥是从密码派生的,宇宙中该密码的所有知识都会消失,密钥以及任何数据都是不可恢复的。

所以,如果你想要一个忘记密码"一种功能,你需要保留一些用户的知识。密码。显然,这样做会降低用户的安全性。数据。首先,如果您(作为运营此类服务的个人)保持用户的知识。密码,您可以访问其所有私人数据。其次,你必须将这些密码保存在某个地方,这意味着它们可能会受到损害。

如果经过仔细分析后,您愿意为了方便而降低安全性,那么您应该小心谨慎。

您可能考虑的一种方案是使用非对称加密来维护用户的加密数据库。密码。您将生成一个强密钥对,并将公钥放在您的Web服务器上。每当用户创建或更改密码时,您都将使用公钥来加密该密码。如果用户需要恢复密码,您的系统将需要人为干预。您需要将加密密码从存储中提取到安全环境中,然后使用私钥对其进行解密。

理想情况下,您不会将加密密码保留在Web服务器上。相反,您可以在Web服务器上对它们进行加密,并立即将它们写入其他配置为允许来自Web服务器的只写访问的强化服务器。

我想如果你有这样的设置,你可以不需要人来解密。这会进一步降低安全性,可能会也可能不会被接受。在这种情况下,您将保留该强化服务器上​​的私钥,以及一些用于解密"丢失"密码,并在网络框上更改密码。当然,这显然不如将私钥完全空转到保险箱中的闪存驱动器或其他任何东西那样安全。

答案 1 :(得分:0)

使用另一个“admin”或“restore”键加密内容加密密钥。最好使用公钥加密和后端,管理良好的私钥来恢复内容密钥和数据(RSA非对称加密,例如使用OAEP填充机制)。

当然,用户应该相信您能够很好地处理私钥。但无论如何,用户必须在某种程度上信任你。用户通常无法验证您要部署的方法来加密/解密/存储数据。