2017-07-03 75 views
1

在线系统(用PHP编写的前端,但不太相关)需要将文本存储在MySQL数据库中进行加密,以便本地系统管理员无法查看数据,也使数据无法在数据库被盗的情况下查看。系统中有多个用户需要访问数据,他们通过标准设置登录/认证,即用户名和散列在同一个数据库中的密码。由于存储的数据需要由系统解密以显示给经过验证的用户,但本地系统管理员必须无法解密相同的数据,显而易见的方法是使用用于加密的密钥/使用对称密码解密存储的数据。这个问题(真的是我要求提供建议的问题)是如何/在哪里存储这个密钥?如何为多个用户存储加密文档

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

因此,一种方法是将密钥存储在数据库中进行加密,但为了让系统在每个用户的基础上解密和使用密钥,必须针对经过验证的用户所特有的内容对其进行加密,例如他们的密码。好吧,迄今为止这么好,但有一个问题...

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

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

有没有更好的方法?

+1

相关:https://security.stackexchange.com/questions/71911/pattern-to-allow-multiple-persons-to-decrypt-a-document-without-sharing-the-enc,https:// security .stackexchange.com/questions/91704/which-strategy-to-encrypt-data-accessible-by-multiple-users – jonrsharpe

+0

@zaph - 好点 - 编辑后,谢谢。 – Paul

+0

你的前端是否真的用PHP编写的?如果是的话,我会很惊讶。 –

回答

0

感谢jonrsharpe在汤姆泄漏的帖子指着我:https://security.stackexchange.com/a/71915

我们将在此基础上的方法我们的系统如下:

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

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

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

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

正是我们需要的!

0

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

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

请记住,只是有权访问加密数据的用户的密码中的一个被泄密,数据被泄露并且随每个此类用户升级。

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

相关问题