如何保护服务器管理员的加密密钥?

时间:2016-09-11 20:55:27

标签: php security encryption cryptography passwords

方案

  • 使用永远不会存储在应用服务器或数据库服务器中的密钥在数据库内部对数据进行加密
  • 密钥在登录时输入,并通过$_COOKIE['key']变量存储以保持持久性(因此用户无需在每次加载页面时输入)
  • 数据通过$_COOKIE['key']
  • 解密 浏览器退出时
  • $_COOKIE['key']被销毁

威胁

Rouge服务器管理员窥探PHP文件,找出密钥存储在$_COOKIE['key']。他注入了像email_me($_COOKIE['key']);这样的恶意代码。获得密钥后,他会删除恶意代码。

问题

有没有办法保护自己免受这种情况的影响?

2 个答案:

答案 0 :(得分:3)

您可以让服务器管理员更难获取密钥,但他们始终可以。

让我们考虑将加密和解密转移到客户端。现在,服务器无法获取密钥,因此服务器管理员不应该能够解密数据。这并不完全正确,因为服务器管理员可以操纵页面JavaScript,以便将密钥发送到服务器或根本不加密任何内容。

客户端可以确定服务器管理员无法窃取其数据的唯一方法是使用开源的客户端软件,并且管理员无法即时更改。因此,网页和自动更新应用程序是不可能的。

答案 1 :(得分:3)

如果密钥本身是一个问题,您可以使用Azure中的Keyvault之类的加密算法,它永远不会释放其中包含的密钥,但会自动对发送给它们的数据执行加密。

当然,管理员只要能够访问加密oracle就可以访问数据,但之后不会访问,并且他们永远不会拥有密钥。这在某些情况下有所帮助,这就是Azure Keyvault等服务的全部要点。此外,您无需向所有管理员提供对加密服务的实际访问权限。

另一种缓解措施(侦探控制,而不是预防措施)是IT和应用程序级别的审计日志记录。如果做得好,甚至管理员也无法隐藏他们访问数据的事实,这也可以帮助减轻一些风险,至少可以提供不可否认性。

您可以做的另一件事是适当的变更管理,控制谁有权访问您的源代码(特别是写访问权限)。使用像PHP这样的脚本语言可能会变得很困难,因为你无法真正签署代码,但是你仍然可以拥有良好的流程来审查和发布生产代码。

所以最后,它可能不是一个技术问题,你可以在流程方面做很多事情。