如何将加密密钥安全地存储在php代码文件中


How to store the encryption keys securely in php code file

我有一个网站,用户向其提交敏感数据,然后php脚本使用rijndael 256加密这些敏感数据,并将其存储在mysql数据库中

问题是,我想把密钥存储在一个安全的地方,这个地方只能由php脚本访问,而不会被任何其他看到

取决于数据所需的安全级别。您可以考虑为每个用户提供不同的安全密钥,方法可能是加密识别特定客户的数据,并将其附加到256位加密密钥上。但更好的方法是将密钥拆分,并在整个密钥中插入加密数据。使其更难破译。这意味着,如果程序员可以访问密钥,那么在没有访问客户加密数据的情况下,程序员就不能简单地解密每个人的数据,这对每个用户来说都是不同的。

的确,程序员仍然可以将密钥回声到屏幕上,但他们也需要为每个想要解密数据的客户加密数据。

如果适用,您也可以考虑使用公钥和私钥加密。客户/用户可以生成自己的密钥。客户将公钥放入网站上的一个表单中,该表单存储在数据库中,然后客户/用户将拥有私钥来解密数据。您使用公钥来加密数据。这意味着每个用户/客户都有自己的一套钥匙。私钥甚至可以放在钥匙卡上,挂在电脑上验证访问权限。

更多信息@http://en.wikipedia.org/wiki/Public-key_cryptography

一种替代方案是让PHP脚本调用一个可以访问密钥的外部脚本(不一定是另一个PHP脚本;它可以是任何东西)。只要没有人对外部脚本有写访问权限,或者如果您将密钥硬编码到其中,则没有人对其有读访问权限,那么它应该是相对安全的。如果将密钥存储在单独的文件中,则该文件需要仅由外部脚本的所有者可读/写。

您可以使用证书加密/解密,并让服务器在启动时请求证书的密码。

好的方面是,您的密钥只在内存中,并且对于每个安装/服务器都可能不同。

然而,这种方法非常痛苦,通常只有当您有自己的系统管理员/不依赖第三方托管提供商时才有效。


中间解决方案,用于为数据库中的每个部分/用户/客户端生成加密密钥,并使用该每个客户端密钥加密敏感数据。这些每个客户端的密钥都用主密钥加密并存储在数据库中,而主密钥则以最低权限存储在磁盘上的某个位置
当你的服务器被完全破坏时,这不会保证你的安全,但在数据泄露/部分破坏的情况下,这确实限制了风险。

如果问题是你不信任a)程序员或b)系统管理员,那你就倒霉了