MySQL加密和密钥管理


10

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

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

似乎很难回答这个问题:密钥存储在哪里?如何最好地保护钥匙?如果密钥存储在每个用户的计算机上,那么如果计算机被利用,该如何保护呢?如果密钥被利用,如何更改密钥?

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


加密和密钥存储的类型取决于您要防止的情况。显然,如果攻击者在服务器上成为root用户或应用程序用户,则他可以使用与应用程序相同的例程进行解密。那么,您想防止什么情况发生?有人偷了备份吗?SQL注入攻击?还有吗
Aleksandar Ivanisevic

谢谢回复!我不太担心备份。我更担心有人利用用户计算机,然后通过SQL注入或破坏用户的应用程序凭据从那里访问该站点。我不太在意机器本身。su的凭据非常强大(不过,我丝毫不怀疑它是100%安全的)。
2010年

Answers:


9

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

但是您所说的担忧有些奇怪:似乎您唯一真正关心的是来自远程客户端台式机/笔记本电脑工作站的SQL注入或蛮力攻击(我猜是密码猜测)。这使我怀疑您已经计划了其他一些未提及的安全措施,并且您已经分析了折衷的可能途径。

  • 首先,我假设您有防火墙规则,可保护MySQL / PHP主机免受未经批准的远程客户端IP的任何访问。如果我是正确的话,那么您就只担心来自受感染用户工作站的攻击。

  • 另外,我假设您了解,如果远程客户端主机上的攻击者可以升级为root / Admin privs,或直接破坏真实用户自己的帐户,则无论加密或任何其他保护措施,该客户端的数据都将受到零保护。(攻击者可以从保存在磁盘上的任何地方读取密钥,也可以在真实用户登录时输入它们时窥探它们,然后密钥会导致数据产生。)

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

  • 如果攻击者无法掌握真实用户的密钥,或者想要获取的不仅仅是真实用户的数据,他可以尝试为真实用户或其他帐户使用强行登录凭据。(理论上,您可以将每个帐户锁定到特定的远程客户端IP,这也将有助于将风险分隔开。)
  • 如果攻击者确实获得了真实用户的有效密钥,那么他将有一条通过登录屏幕(可能足够简单以确保安全)以外的途径,到达潜在错误的应用程序代码的软肋。从真实用户的上下文中成功进行SQL注入也可以使他访问其他客户端数据。

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

  • 服务器端加密绝对有助于抵御SQL注入威胁。如果行值在数据库表中被加密,则攻击者只能看到属于其他帐户的数据的乱码密文。威胁被遏制,隔离。
  • 但是,对于面对服务器端加密的攻击者而言,暴力破解密码猜测并没有真正增加难度。无论用户的密钥是存储在服务器上还是由密码现场生成,唯一重要的是您是否拥有正确的密码。服务器要么因为检查密码是否正确而决定让您使用有效的存储密钥,要么因为您的密码是生成该密钥的正确输入,所以服务器为您计算了有效密钥。

另一方面,客户端加密实际上使暴力密码攻击无关紧要。您不能强行使用正确构造的密钥。客户端加密也与服务器端加密保持基本相同的保护级别,以防止SQL注入。客户端可以在登录时将密钥传递给服务器,将副本保留在内存中,直到会话结束为止,这将使加密CPU负担加重到服务器上。或者,客户端可以在浏览器中自行处理加密/解密。两种技术都有起有落:

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

最后,我要指出的是,加密数据库中的数据存在一些巨大的操作弊端。因为加密的数据表示本质上是随机模式,所以基本的数据库功能(如索引,联接等)将无法使用。客户端承担着巨大的逻辑负担,并且可能会失去数据库功能通常带来的许多好处。


1
哇!惊人而彻底的答案;非常感谢你。在过去的几天中,我一直在考虑一些选择,并决定尝试按照您的建议实施客户端解决方案。理想情况下,密钥将存储在拇指驱动器上,该拇指驱动器仅在用户在系统上工作时安装(物理安全性非常严格),并且密钥只有在会话存在时才保留在内存中。想法是,各键将只会对系统访问的工作时间期间,当我在那里监控流量,等等
stormdrain

2

您可能想看看ezNcrypt,它使用ecryptfs,访问控制和密钥管理为MySQL数据库和其他进程的Linux加密提供高安全性和性能。不,我不为他们工作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.