如何安全地存储加密密钥

时间:2015-04-25 20:33:07

标签: encryption aes

我被要求在工作中保护保存在Mysql数据库中的敏感数据。该数据库包含几个表,其中一个表具有关键数据,只能使用在Django中完成的API访问。对于此API,只有一定数量的人可以访问它,因此他们将是唯一能够访问此表中数据的人。

所以,目前的问题是每个人都可以访问数据库和这个表,所以我们决定使用AES加密来自该表的所有数据,借助AES_ENCRYPT()和AES_DECRYPT()函数(根据到https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html)。

所以....到目前为止一切正常,但主要问题是如何存储用于加密/解密的AES密钥。 在与我的同事和谷歌进行了一些头脑风暴之后,我发现最好的办法是使用密钥包装器(http://en.wikipedia.org/wiki/Key_Wrap),其中包括使用属于该密钥的密钥加密原始密钥(主密钥)。可以访问与数据库表交互的API的人员。因此,我正在考虑使用可以访问此API的每个人的公钥的公钥来加密此密钥,并将加密版本存储到任何人都可以访问的表中。然后,当用户需要主密钥时,他/她只需要检索加密密钥,用他/她的私钥解密,最后他/她将密钥输入登录会话,这样他们就可以通过API使用它。

我只是想知道是否有更好的选择。

1 个答案:

答案 0 :(得分:0)

使用一个密钥加密内容(“内容加密密钥”或 CEK ),然后使用每个授权收件人的密钥加密 密钥的方法(“密钥加密密钥“或 KEK ”是一个很好的密钥,它用于许多标准协议,如S / MIME,PGP等。

但是:在这种环境中,您将在哪里存储授权用户的私钥?你将如何保密?

可行性取决于您的应用程序,但使用对称算法为每个用户加密CEK可能更好。每当该用户想要访问CEK时,他们必须重新输入他们的密码,以便服务器永远不会将他们的密钥存储在明文中。