在我的数据库中,我存储了通过PHP类动态加密和解密的信息。
每个应用程序我使用附加用户密钥的私钥来确保解密仅在用户尝试解密自己的数据时成功。
用户'密钥'存储在数据库中;但私钥(应用程序级别)存储为FS中的txt文件。当然,“在网络根目录之上”。
考虑:
- 如果数据库被黑客入侵:他们最终得到密钥的一部分和加密数据
- 如果PHP停止或已损坏:它们最终只有一个页面,其中只有include('../private/private.php')
- 如果NGINX失败:连接“刚好”掉线。
我能想到的唯一情况是系统本身的腐败。但是服务器运行防火墙,定期更新,运行fail2ban,只运行所需的服务。 SSH只能通过密钥访问等登录
我想知道这是否是“最佳”做法。 或者,如果有更好的方法来执行上述规范的这种加密? 密钥文件的正确访问权限是什么?
目前,数据库和网络服务器都在面向互联网的同一台服务器上。拆分它们并创建一个只有Web服务器的面向Internet的服务器是否更好;并将数据库服务器和密钥文件放在专用网络中的其他服务器上?
编辑:加密数据的私钥由两个组成部分构成:
$key = $app_key . $user_key
答案 0 :(得分:2)
我想知道这是否是“最佳”做法。或者如果有的话 使用上述规格进行此类加密的更好方法是什么? 密钥文件的正确访问权限是什么?
难以实施
为了完全安全,您需要在HSM(硬件安全模块)上生成私钥 - 公钥对,例如智能卡或HSM盒。生成的私钥是在HSM内部创建的,永远不会离开HSM,它只能用于HSM内部的解密/签名操作,但永远不能从HSM读取。在这种情况下,如果某人攻击您的服务器,甚至完全控制您的服务器,他们就永远无法获取存储在HSM中的私钥。根据服务器上所需的解密/签名操作数量,您需要一个合理执行的HSM来解密所需的数据。然而,在纯PHP中完成此任务还有很长的路要走(您可以实现自己的C ++扩展或使用能够与HSM交互的进程进行进程间通信)
更容易实施
尽可能多地强化服务器并最小化攻击向量非常重要。这主要包括为文件和数据库分配适当的权限。请查看this以获得一些良好的安全措施。 要加上我的几美分,你可以使用:
答案 1 :(得分:1)
您可以将密钥加载到APC或类似的东西。这将需要在引导期间进行人工输入(或者可能从更安全的服务器启动)。这意味着密钥永远不会存储在服务器上的任何文件中。
它并不完美,但它比使用本地文件的更典型方法更好。
答案 2 :(得分:0)
查看OWASP加密存储备忘单及其建议。规则2.1.5.4:保护密钥保险库中的密钥。密钥不应存储在应用程序或Web服务器上。