我正在使用PHP / MySQL开发本地Intranet系统来管理我们的客户端数据。似乎最佳做法是在输入时加密MYSQL服务器上的敏感数据。
但是,我不清楚,在仍然可以轻松访问数据的同时,最好的方法是什么。
这似乎是一个难以回答的问题:密钥存储在哪里?如何最好地保护钥匙?如果密钥存储在每个用户的计算机上,如果机器被利用,如何保护密钥?如果密钥被利用,如何更改密钥?
如果要将密钥存储在db中,如何保护它?用户将如何访问它?
如果有人能指出我正确的方向,或给出一些提示,我将非常感激。
感谢。
实际上没有任何内置的MySQL功能可用于处理复杂的加密密钥设置。您需要在自己的PHP和/或浏览器端(javascript?)代码中实现大量加密逻辑。
但你陈述的担忧有点奇怪:似乎你唯一真正关心的是从远程客户端桌面/笔记本电脑工作站进行的SQL注入或暴力攻击(猜测密码,我猜)。这让我怀疑你已经计划了一些其他未提及的安全措施,并且你已经分析了可能的妥协途径。
首先,我假设你有防火墙规则来保护MySQL / PHP主机免受未经批准的远程客户端IP的任何访问。如果我是正确的,那么你只关心受到攻击的用户工作站的攻击是有道理的。
此外,我假设您了解如果远程客户端主机上的攻击者可以升级到root / Admin privs,或直接破坏真实用户自己的帐户,那么无论加密如何,该客户端的数据都不会受到保护或任何其他保障措施。 (攻击者可以从磁盘上保存的任何地方读取密钥,或者在真实用户登录时输入密钥,密钥导致数据。)
从这两个假设开始,我们有理由得出结论,只有两个相关的威胁是A)暴力密码猜测,以及B)SQL注入尝试:
现在,我们来谈谈服务器端加密如何应用于这些情况:
另一方面,客户端加密实际上使暴力密码攻击无关紧要。你不能强行使用正确构造的密钥。客户端加密与基于服务器端加密的SQL注入基本保持相同的保护级别。客户端可以在登录时将密钥传递给服务器,将副本保留在内存中直到会话结束,这会将加密CPU负担放在服务器上。或者,客户端可以在浏览器中自行处理加密/解密。两种技术都有起伏不定:
最后,我要指出,加密数据库中的数据有一些巨大的操作缺点。由于加密数据表示基本上是随机模式,因此基本数据库功能(如索引,连接等)不起作用。客户端承担了巨大的逻辑负担,并且可能会失去数据库功能通常带来的诸多好处。