如何为多个用户存储加密文档

Pau*_*aul 3 php mysql encryption libsodium

在线系统(用 PHP 编写的前端,但不太相关)需要将文本加密存储在 MySQL 数据库中,以便本地系统管理员无法查看数据,并且在数据库被盗时也无法查看数据。系统上有多个用户必须有权访问数据,他们通过标准设置登录/身份验证,即同一数据库中的用户名和散列密码。

由于存储的数据需要由系统解密才能显示给经过身份验证的用户,但本地系统管理员必须无法解密相同的数据,因此显而易见的方法是使用一个密钥来加密/解密存储的数据。使用对称密码的数据。问题(实际上是我寻求建议的问题)是如何/在哪里存储这个密钥?

经过身份验证的用户不应该直接访问密钥,因此需要以某种方式将其存储在系统中,并由软件根据需要使用它来解密存储的文件,但本地系统管理员也不能了解此密钥,否则他们可以用它来解密存储的数据。

因此,一种方法是将密钥加密存储在数据库中,但为了使系统能够在每个用户的基础上解密和使用密钥,必须针对经过身份验证的用户特有的内容(例如密码)对其进行加密。好的,到目前为止一切顺利,但是有一个问题......

如果需要更改密钥怎么办?更改密钥的人要么必须知道每个人的密码,以便他们可以针对每个用户帐户加密新密钥(不切实际),要么他们必须将新密钥提供给每个用户并要求他们重新输入(而不是选项)。

另外,从安全角度来看,让这个密钥在数据库中有效存储 n 次(其中 n 是用户数),并使用不同的密钥(用户密码)加密,这是一个好主意吗?即,这是否会通过向潜在的黑客提供相同加密数据的多个示例来更多地暴露密钥?

有没有更好的办法?

Pau*_*aul 5

感谢 jonrsharpe 向我指出 Tom Leak 的帖子: https: //security.stackexchange.com/a/71915

我们的系统将基于此方法,如下所示:

  • 文档存储在使用对称密码加密的表中。

  • 上述对称密码的秘密密钥存储在单独的表中,对于有权访问该文档的每个用户一次,使用非对称密码和用户的公钥进行加密。

  • 用户的私钥存储在另一个使用对称密码加密的表中,其密钥是用户的密码。

这意味着只需删除该用户在文档密钥表中的条目即可撤销对文档的访问;如果文档被修改,系统只需删除密钥表中该文档的所有条目,然后用每个用户的公钥加密将它们添加回来;只需将条目添加到使用用户的公钥加密的文档密钥表中,即可授予其他用户访问权限;有权访问该文档的用户可以使用其私钥解密该文档的密钥,而该私钥又使用自己的密码进行解密。

正是我们所需要的!