我正在PHP / MySQL中开发本地Intranet系统,以管理我们的客户端数据。似乎最佳实践是在输入MySQL服务器上的敏感数据时对其进行加密。
但是,我仍然不清楚在保持数据可随时访问的同时执行此操作的最佳方法是什么。
似乎很难回答这个问题:密钥存储在哪里?如何最好地保护钥匙?如果密钥存储在每个用户的计算机上,那么如果计算机被利用,该如何保护呢?如果密钥被利用,如何更改密钥?
如果密钥要存储在数据库中,如何在其中进行保护?用户将如何访问它?
我正在PHP / MySQL中开发本地Intranet系统,以管理我们的客户端数据。似乎最佳实践是在输入MySQL服务器上的敏感数据时对其进行加密。
但是,我仍然不清楚在保持数据可随时访问的同时执行此操作的最佳方法是什么。
似乎很难回答这个问题:密钥存储在哪里?如何最好地保护钥匙?如果密钥存储在每个用户的计算机上,那么如果计算机被利用,该如何保护呢?如果密钥被利用,如何更改密钥?
如果密钥要存储在数据库中,如何在其中进行保护?用户将如何访问它?
Answers:
确实没有用于处理复杂的加密密钥设置的内置MySQL功能。您将需要在自己的PHP和/或浏览器端(javascript?)代码中实现大量的加密逻辑。
但是您所说的担忧有些奇怪:似乎您唯一真正关心的是来自远程客户端台式机/笔记本电脑工作站的SQL注入或蛮力攻击(我猜是密码猜测)。这使我怀疑您已经计划了其他一些未提及的安全措施,并且您已经分析了折衷的可能途径。
首先,我假设您有防火墙规则,可保护MySQL / PHP主机免受未经批准的远程客户端IP的任何访问。如果我是正确的话,那么您就只担心来自受感染用户工作站的攻击。
另外,我假设您了解,如果远程客户端主机上的攻击者可以升级为root / Admin privs,或直接破坏真实用户自己的帐户,则无论加密或任何其他保护措施,该客户端的数据都将受到零保护。(攻击者可以从保存在磁盘上的任何地方读取密钥,也可以在真实用户登录时输入它们时窥探它们,然后密钥会导致数据产生。)
从这两个假设出发,我们可以得出结论,只有两个相关的威胁是A)蛮力密码猜测和B)SQL注入尝试:
现在,让我们讨论一下服务器端加密如何应用于这些情况:
另一方面,客户端加密实际上使暴力密码攻击无关紧要。您不能强行使用正确构造的密钥。客户端加密也与服务器端加密保持基本相同的保护级别,以防止SQL注入。客户端可以在登录时将密钥传递给服务器,将副本保留在内存中,直到会话结束为止,这将使加密CPU负担加重到服务器上。或者,客户端可以在浏览器中自行处理加密/解密。两种技术都有起有落:
最后,我要指出的是,加密数据库中的数据存在一些巨大的操作弊端。因为加密的数据表示本质上是随机模式,所以基本的数据库功能(如索引,联接等)将无法使用。客户端承担着巨大的逻辑负担,并且可能会失去数据库功能通常带来的许多好处。
您可以使用Scytale。它是现代DBMS和Web应用程序的NoSQL加密代理。支持多收件人和组加密。装有强大的RSA / AES密码系统。它也是100%免费和开源的。