2013-12-11 16 views
5

在我的数据库中,我存储了通过PHP类实时加密和解密的信息。在PHP环境中存储用于加密的私钥的位置

每个应用程序我使用一个附有用户密钥的私钥来确保解密只在用户试图解密自己的数据时成功。

用户'密钥'存储在数据库中;但私钥(应用程序级别)作为txt文件存储在FS中。当然,在网络根目录之上。

注意事项: - 如果数据库遭到黑客攻击:他们最终与关键字的一部分,和加密数据 - 如果PHP-停止或已损坏:他们最终与唯一include('../private/private.php')在一个单一页面。
- 如果NGINX失败:连接刚被丢弃。

我能想到的唯一场景就是系统本身的腐败。但服务器运行防火墙,定期更新,运行fail2ban,只运行所需的服务。 SSH登录只能通过密钥访问等等

我在想这是不是最好的做法。 或者如果有更好的方法来做这种以上规格的加密? 什么是对密钥文件的正确访问权限?

目前数据库和网络服务器都在同一台面向互联网的服务器上。将它们分开并创建一个只有Web服务器的面向互联网的服务器会更好吗?并将数据库服务器和密钥文件放在专用网络中的不同服务器上?

编辑:私有密钥来加密数据是由两个组件构建:
$key = $app_key . $user_key

+3

对密钥文件的正确访问权限是“-r --------”或“400”,而web服务器用户是所有者。除此之外,看起来你做得相当不错 –

+1

*“我使用附加了用户密钥的私钥来确保解密只在用户试图解密自己的数据时才能成功”*我不确定那是什么手段。您将两个密钥都保存在服务器上,因此解密只要您希望就能成功。相反,如果服务器被拥有,数据也是拥有的。 – Jon

+0

它的一个能力开始完全取决于你有什么级别的信息,以及你需要与安全有多紧。对于大多数常见的场景,你可能没有问题,尽管你可能想考虑对运行在OS下的守护进程运行审计,以检查它们上是否有任何已知的攻击媒介,例如ssh'd版本等 – Dave

回答

1

可以将密钥加载到APC或类似的东西。这需要在启动时输入人工信息(或者从更安全的服务器启动)。这意味着密钥永远不会存储在服务器上的任何文件中。

这并不完美,但它比使用本地文件更典型的方法更好。

剂适量,Where should I store an encryption key for php?

2

我在想,如果这是 '最好' 的做法。或者如果有更好的方式来做这种以上规格的加密? 什么是对密钥文件的正确访问权限?

难以实现

是完全安全的,你需要生成一个HSM(硬件安全模块)对公私密钥对诸如智能卡或HSM盒。生成的私钥在HSM内部创建,永远不会离开HSM,它只能用于HSM本身内部的解密/签名操作,但永远不能从HSM读取。在这种情况下,如果有人攻击你的服务器,或者甚至完全控制你的服务器,他们永远不能获得存储在HSM中的私钥。根据服务器上所需的解密/签名操作的数量,您需要合理执行的HSM来解密所需的数据。实现在纯PHP这个任务可是一个很长的路要走(你也可以实现自己的C++的扩展,或者使用与一个过程,是与硬件安全模块能够互动的进程间通信)

更容易实现

尽可能多地强化服务器并尽量减少攻击向量,这一点很重要。这主要包括为文件和数据库分配适当的权限。看看this有一些很好的安全措施。在PHP你的私钥的存储器

  1. APC的(这也将让您在性能的提高与constanlty阅读从一个文件中的一个关键比较): 要加我几毛钱就可以使用。每次重新启动Web服务器时,您都需要实施一些安全机制(例如输入密码)以将加密密钥解密/恢复到APC中。
  2. 喜欢的东西ionCube使用的应用程序容器,如docker

目前数据库和Web服务器加密,保护您的PHP脚本

  • 控制在部署过程中都面临着同样的服务器 上互联网。将它们分开并创建面向只有Web服务器的服务器的互联网 会更好吗?并将数据库服务器和 密钥文件放在专用网络中的不同服务器上?

  • 是的,将网络服务器与数据库服务器分开绝对是一种好的做法。

    0

    看看OWASP加密存储备忘单及其建议。规则2.1.5.4:保护密钥库中的密钥。密钥不应该存储在应用程序或Web服务器上。