我正在PHP / MySQL中开发一个本地Intranet系统来pipe理我们的客户端数据。 看来最好的做法是在inputMYSQL服务器时encryption敏感数据。
但是,我不清楚,在保持数据可用的情况下,最好的办法是什么。
这似乎是一个棘手的问题来回答:密钥存储在哪里? 如何最好地保护钥匙? 如果密钥存储在每台用户的机器上,如果机器被利用,如何保护它? 如果密钥被利用,如何更改密钥?
如果关键是要存储在分贝,如何保护它呢? 用户将如何访问它?
如果有人能指出我正确的方向,或者给我一些提示,我会非常感激。
谢谢。
实际上没有任何内置的MySQLfunction可以处理复杂的encryption密钥设置。 您需要在您自己的PHP和/或浏览器端(JavaScript?)代码中实现大部分encryption逻辑。
但是你所expression的担忧有点奇怪:看起来你唯一真正关心的是来自远程客户端台式机/笔记本电脑工作站的SQL注入或暴力破解(我猜是猜测)。 这让我怀疑你已经有一些其他未提及的安全措施了,而且你已经分析了可能的妥协途径。
首先,我假设你有防火墙规则保护MySQL / PHP主机免受来自未经批准的远程客户端IP的任何访问。 如果我是正确的,那么你只是担心受害用户的工作站的攻击是有道理的。
此外,我假设您了解,如果远程客户端主机上的攻击者可以升级到root / Admin privs,或者直接危害真实用户自己的帐户,那么无论encryption或其他安全措施如何,该客户端的数据都不会受到任何保护。 (攻击者可以从保存在磁盘上的任何位置读取密钥,也可以在真实用户login时input这些密钥,密钥导致数据。
从这两个假设开始,我们有理由得出结论,唯一的两个相关的威胁是:A)暴力密码猜测; B)SQL注入尝试:
现在,让我们来谈谈服务器端encryption如何应用于这些情况:
另一方面,客户端encryption实际上使暴力密码攻击无关紧要。 你不能蛮力强制build造一把钥匙。 客户端encryption与服务器端encryption保持基本相同的防SQL注入级别。 客户端可以在login时将密钥传递给服务器,并在内存中保留一个副本,直到会话结束,这将encryption服务器上的CPU负担。 或者,客户端可以在浏览器中自行处理encryption/解密。 这两种技术都有起伏:
最后,我要指出的是,在数据库中encryption数据有一些巨大的操作缺点。 由于encryption数据表示本质上是随机模式,因此索引,连接等基本数据库function不起作用。 客户承担了巨大的逻辑负担,并可能失去数据库function通常带来的许多好处。
您可能需要查看ezNcrypt ,它使用ecryptfs,访问控制和密钥pipe理为MySQL数据库和其他进程的Linuxencryption提供高安全性和性能。 不,我不为他们工作。
你可以使用Scytale。 它是现代DBMS和Web应用程序的NoSQLencryption代理。 支持多收件人和群组encryption。 加载了强大的RSA / AES密码系统。 它也是100%免费和开源的。