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