存储AES_ENCRYPT密钥

时间:2011-08-03 12:45:43

标签: mysql mysqli aes

这更多是关于使用AES_ENCRYPT为插入MySQL数据库的数据生成加密的安全问题。

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

3 个答案:

答案 0 :(得分:1)

嗯,你没有太多选择。无论您放置该密钥(数据库,代码,文件),只要其他人可以访问该计算机,就可以轻松找到该密钥。

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

答案 1 :(得分:1)

Security by obscurity

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

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

为了提供合理的答案,我们需要知道威胁模型是什么以及您是否有外部约束,例如PCI-DSS

答案 2 :(得分:0)

将PHP / Python /其他应用程序中使用的密钥和密码安全地存储在服务器上的问题,不仅与隐藏已从您的服务器上扎根的攻击者的密钥有关,您可以使拥有root权限的攻击者更难以访问它们,最终可以做到这一点。

但是,密钥/密码可能以其他许多方式丢失,因此必须加以保护。例如,如果您的软件是从开发环境中更新的,即通过git服务器进行推拉,则您不希望密钥包含在纯文本中源代码。这样,开发团队中的任何人都可以访问它们。

“更安全”地存储密钥的一种方法是将密钥配置为环境变量,然后通过访问该环境变量将它们包含在应用程序中,而不是将密钥包含在“纯文本”中在您的应用程序中。

但是,这要求您将环境变量设置为持久性,以便在重新启动服务器时将自动重新设置它,否则必须在每次重新启动时进行设置。

如果使用Apache Web服务器,则还可以在httpd.conf文件中为敏感密钥/密码设置Apache环境变量,然后从PHP脚本访问它们。您还可以限制对httpd.conf文件的访问权限,仅root用户可以读取/写入。

// Example use of getenv()
$sensitive_key = getenv("VERY_SENSITIVE_KEY");

// Example use of apache_getenv()
$sensitive_key = apache_getenv("VERY_SENSITIVE_KEY");

这意味着密钥/密码不包含在应用程序源代码本身中,并且不太可能逃脱服务器。