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

时间:2017-07-03 11:21:41

标签: php mysql encryption libsodium

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

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

经过身份验证的用户不应该直接访问密钥,因此需要以某种方式存储在系统中并由软件根据需要解密存储的文件,但本地系统管理员也必须无法学习此密钥或者他们可以用它来解密存储的数据。

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

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

另外,从安全的角度来看,这个密钥是否有效地存储在数据库中n次(其中n是用户数),用不同的密钥加密(用户密码)?即通过给潜在的黑客提供相同加密数据的多个例子,这是否会更多地暴露关键?

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

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

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

请记住,只有访问加密数据的用户的密码之一才会受到损害,数据会受到损害,并且每个此类用户都会对其进行升级。

减少有访问权限的系统管理员数量的另一个解决方案是将数据库放在专用服务器上,只有极少数系统管理员具有双因素身份验证且无法直接访问Internet,只能从服务器在线服务器进行安全访问。 / p>

答案 1 :(得分:0)

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

我们将系统基于以下方法:

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

  • 上述对称密码的密钥存储在一个单独的表中,每个用户可访问该文档,使用带有用户公钥的非对称密码加密。

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

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

正是我们需要的!