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

How to store encrypted documents for multiple users

一个在线系统(用 PHP 编写的前端,但不太相关)需要将文本存储在加密的 MySQL 数据库中,这样本地系统管理员就无法查看数据,也使得如果数据库被盗,则无法查看数据。系统上有多个用户必须有权访问数据,他们 login/authenticate 通过标准设置,即同一数据库中的用户名和散列密码。

由于存储的数据需要由系统解密才能显示给经过身份验证的用户,但本地系统管理员肯定无法解密相同的数据,显而易见的方法是拥有一个密钥,用于encrypt/decrypt 使用对称密码存储的数据。问题(真的是我要征求意见的问题)是 how/where 存储这个密钥?

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

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

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

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

有没有更好的方法?

一种解决方案是在用户密钥和数据库密钥之间添加更多级别的密钥。然后,如果数据被重新加密,则只需要重新加密一个额外的密钥。也可能只需更改最后一个密钥即可完成更改加密密钥的需要,而不是使用新密钥重新加密数据。

但也许还有其他更好的解决方案,例如可以使用 DB 角色。

请记住,这只是有权访问加密数据的用户的密码之一被泄露数据被泄露,并且每个这样的用户都会升级。

减少具有访问权限的系统管理员数量的另一种解决方案是将数据库放在专用服务器上,只有极少数系统管理员使用双因素身份验证并且不能直接访问互联网,只能从服务器在线服务器进行安全访问.

感谢 jonrsharpe 指出 Tom Leak 的 post:https://security.stackexchange.com/a/71915

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

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

  • 上述对称密码的密钥存储在单独的 table 中,每个有权访问该文档的用户一次,使用非对称密码与用户的 public键.

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

这意味着可以通过简单地删除该用户在文档密钥中的条目来撤销对文档的访问 table;如果文档被修改,系统只需要删除密钥 table 中文档的所有条目,然后使用每个用户 public 密钥将它们加回加密;只需在使用用户的 public 密钥加密的文档密钥 table 中添加一个条目,即可为其他用户授予访问权限;有权访问文档的用户可以使用他们的私钥解密文档的密钥,然后使用他们自己的密码解密。

正是我们所需要的!