MySQL 加密和密钥管理

sto*_*ain 10 mysql encryption

我正在用 PHP/MySQL 开发本地内联网系统来管理我们的客户端数据。似乎最佳实践是在输入 MySQL 服务器上的敏感数据时对其进行加密。

但是,我不清楚在仍然可以轻松访问数据的同时执行此操作的最佳方法是什么。

这似乎是一个很难回答的问题:密钥存储在哪里?如何最好地保护密钥?如果密钥存储在每个用户的机器上,如果机器被利用,如何保护它?如果密钥被利用,如何更改密钥?

如果密钥要存储在数据库中,如何保护它?用户将如何访问它?

Rya*_*nch 9

没有任何内置的 MySQL 功能来处理复杂的加密密钥设置。您需要在自己的 PHP 和/或浏览器端 (javascript?) 代码中实现大部分加密逻辑。

但是您陈述的担忧有点奇怪:似乎您唯一真正担忧的是来自远程客户端桌面/笔记本电脑工作站的 SQL 注入或蛮力(我假设是密码猜测)攻击。这让我怀疑您已经计划了一些其他未提及的安全措施,并且您已经分析了可能的妥协途径。

  • 一方面,我假设您有防火墙规则保护 MySQL/PHP 主机免受来自未经批准的远程客户端 IP 的任何类型的访问。如果我是对的,那么您只担心来自受感染用户工作站的攻击是有道理的。

  • 此外,我假设您了解,如果远程客户端主机上的攻击者可以升级到 root/Admin 权限,或者直接破坏真实用户自己的帐户,那么无论加密或任何其他保护措施如何,该客户端的数据都具有零保护。(攻击者可以从保存在磁盘上的任何位置读取密钥,或者在真实用户在登录时输入它们时窥探它们,并且密钥会导致数据。)

从这两个假设开始,我们可以得出结论,唯一的两个相关威胁是 A) 蛮力密码猜测,和 B) SQL 注入尝试:

  • 如果攻击者没有获得真实用户的密钥,或者他想要访问的不仅仅是真实用户的数据,他可以尝试暴力破解真实用户或其他帐户的登录凭据。(理论上,您可以将每个帐户锁定到特定的远程客户端 IP,这也有助于划分风险。)
  • 如果攻击者确实获得了真实用户的有效密钥,他就可以通过登录屏幕(这可能足够简单以确保安全)到达潜在错误应用程序代码的软肋。来自真实用户上下文的成功 SQL 注入也可以让他访问其他客户端数据。

现在,让我们谈谈服务器端加密如何应用于这些情况:

  • 服务器端加密绝对有助于抵御 SQL 注入威胁。如果数据库表中的行值被加密,攻击者只能看到属于其他帐户的数据的乱码密文。威胁被遏制、隔离。
  • 但是,对于面临服务器端加密的攻击者来说,蛮力猜测密码并没有真正变得更加困难。无论用户的密钥是存储在服务器上还是根据密码现场生成,唯一重要的是您是否拥有正确的密码。服务器决定让您使用有效存储的密钥,因为它检查您的密码是否正确,或者它为您计算有效密钥,因为您的密码是生成该密钥的正确输入。

另一方面,客户端加密实际上使暴力密码攻击变得无关紧要。您无法对正确构造的密钥进行暴力破解。客户端加密也与服务器端加密保持基本相同的 SQL 注入保护级别。客户端可以在登录时将密钥传递给服务器,将副本保存在内存中直到会话完成,这将加密 CPU 的负担置于服务器上。或者,客户端可以在浏览器中自行处理加密/解密。这两种技术各有优劣:

  • 将其密钥传递给服务器更容易编码和管理,并且由于更优化的加密代码(可能是 C 编译)通常更快。
  • 纯粹的客户端方法提供了额外的安全性,因为即使攻击者在服务器上获得 root 权限,他仍然无法读取加密数据,并且永远无法读取它。唯一可能的攻击媒介是危害远程客户端工作站。

最后,我要指出的是,加密数据库中的数据存在一些巨大的操作缺点。因为加密数据表示本质上是随机模式,索引、连接等基本数据库功能将不起作用。客户端承担了巨大的逻辑负担,可能会失去很多数据库特性通常带来的好处。