2011-08-03 190 views
1

这更多的是有关使用AES_ENCRYPT对插入MySQL数据库的数据进行加密的安全问题。存储AES_ENCRYPT密钥

什么是存储用于加密数据的密钥的最佳位置?显然不在数据库中! :)

回答

1

那么,你没有太多的选择。无论您将该密钥(数据库,代码,文件)放在哪里,只要其他人可以访问该机器,就可以轻松找到该密钥。

你可以做的是,你使用另一个密钥加密该密钥,该密钥基于某个密码(该密码不存储在任何地方,至少不是本地),并在应用程序启动时要求密码。这样,您可以将加密的AES_ENCRYPT密钥存储到您的数据库中,使用您的密码登录并解密,然后开始使用它。

1

Security by obscurity

如果您的网络服务器遭到入侵,那么攻击者无论存储在哪里都可以访问密钥 - 因为代码必须能够找到执行加密/解密的密钥 - 并且代码解释了它在哪里找到密钥。这增加了真正价值的唯一场景是保护应用程序之外的数据(例如在备份磁带上)。但是,由于您损害DBM优化查询和创建更大数据占用空间的能力,出于备份等目的,加密备份或文件系统更有意义 - 而不是单个数据项。

即使您使用的密钥不是永久存储在您的应用程序中(例如,通过SSL提供的HTTP基本身份验证密码),仍然存在很多数据会受到危害的风险 - 并且您遇到共享问题不同用户之间的数据。

为了提供一个合理的答案,我们需要知道威胁模型是什么,以及你是否有外部制约因素,如PCI-DSS

+0

正确的。我倾向于维护一个两级密钥,其中一半存储为数据库中的随机值,另一半存储在PHP脚本中。如果有人可以同时访问PHP脚本和数据库,那么没有其他任何事情可以做到。 – Ben

+0

在数据库中存储一半数据是没有意义的,就像有人可以访问PHP一样,他也可以访问数据库。 – mgutt