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


Encrypted files with a key derivated from password... What if user forgets password

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

用户的密码是SHA512散列的,所以我不能反转/解密它们。用户的文件是用一个随机的file_key加密的,它是在我的数据库中加密的,知道文件的file_key的唯一方法是使用用户的密码来解密file_key。我这样做是因为我不想在每次用户更改密码时重新加密所有文件,而是使用用户的新密码重新加密file_key并将其重新存储在数据库中。

生成加密用户数据的密钥;称之为"内容"加密密钥。"从用户的密码中获取密钥;称之为"密钥加密密钥。"加密"内容加密密钥"密钥加密密钥。"将加密的密钥与盐和用于密钥派生的迭代次数。

如果他们更改了密码,则使用使用旧密码,并使用从新密码派生的密钥对其重新加密密码。您应该为新密码选择一个新盐,并制作您可以将它与新的加密密钥一起存储。

我想到了一个小(大)问题,事实上,如果用户忘记密码并要求重置密码,我将失去所有加密文件,因为没有原始密码我无法访问加密文件。

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

这应该是相当明显的,密钥是从密码派生的,并且宇宙中所有关于该密码的知识都消失了,密钥以及因此的任何数据都是不可恢复的。

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

如果经过仔细分析,您愿意为了方便而降低安全性,那么您会希望这样做非常小心。

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

理想情况下,您不会将加密密码保存在web服务器上。相反,你可以在web服务器上加密它们,并立即将它们写入其他一些强化的服务器,配置为允许从web服务器只写访问。

我想如果你有这样的设置,你可以消除对人类解密的需要。这将进一步降低安全性,可能是可接受的,也可能是不可接受的。在这种情况下,您可以将私钥保存在加固的服务器上,以及一些代码,这些代码将使用它来解密"丢失"的密码,并在web盒上影响密码更改。当然,这显然不如把私钥完全密封在闪存驱动器上,放在保险箱里或其他什么地方安全。

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

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