保护数据库内容

时间:2016-09-05 14:48:07

标签: mysql security encryption

根据评论进行编辑。

我的公司正在开发一个系统,并处于早期设计阶段。我是该项目的负责人。要存储在系统中的一些信息是高度机密的。系统必须保护此信息,以便只有授权用户才能查看此信息。事实上,我们甚至想要保护自己免受自身伤害。要使用的数据库可能是mySQL,但不一定是。我知道数据可以在数据库中加密。我也知道该软件必须能够从授权用户的数据库中检索这些数据。我不希望任何开发人员(包括我自己)能够在生产中解密和查看此信息 - 但他们确实需要能够在开发期间查看它(我们将在开发期间禁用加密)。

该软件将是基于云的产品,但也将提供内部托管选项。

我们可以使用基于软件的加密技术,并且我意识到如果软件可以获取数据,那么它是可访问的 - 但我希望这样做尽可能紧,这样开发人员就不能(包括我自己)查看这些数据,但登录后,授权用户可以查看。

我陷入了自己的思维方式,关于如何做到这一点,所以我正在寻求如何确保这一点的建议。

客户端需要解密密钥才能解密数据。该软件必须允许授权用户访问此密钥。用户无法将此密钥保存为"客户端"设备几乎可以是任何东西。现在我知道我无法控制有权访问的最终用户对数据做了什么,而且并不关心。我希望他们能够存储这些信息,并以我无法看到的方式保护它!我也不想让自己有权看到它 - 但是要让这种能力掌握在用户方可信赖的管理员手中。

数据可以是二进制数据。我不想加密整个数据库,也不想再需要重新加密数据,因为它可能是大量的数据。

我已经阅读了有关使用GnuPG通过公钥进行加密和解密的帖子,这些公钥通过一组多个私钥中的任何一个进行加密和解密。这可能是可行的,但我正在寻找多种解决方案。我的问题"这是保护私钥和发布这些私钥的密码短语。我真的不希望用户每次登录系统时都必须输入与私钥相关的密码,或者尝试查看加密/受保护的数据,但我不想存储此密码密码短语,开发人员也可以看到它!

我了解PKI但它并没有为可以访问使用公钥/私钥对共享的主解密密钥的开发人员提供保护。

我已使用建议的解决方案编辑了问题,请在其中打孔。

开发语言是C#。 Microsoft支持不对称密钥,这是我们想要使用的。

X509证书将用于加密密钥。公钥将存储在数据库中并用于所有加密。私钥也将存储在数据库中,但使用受信任管理员输入的密码进行加密。 (这是我心中的薄弱环节,稍后会详细介绍。)

管理员将创建有权访问加密数据的用户。将通过管理员向用户发放私有解密密钥的副本,并且该密钥将与其用户帐户相关联,并使用其初始密码短语在系统中加密。

当用户首次登录并提示更改其密码短语时,将使用新的密码短语重新加密私钥。他们的密码短语不存储在数据库中,只是用于验证的哈希。他们的密钥密码短语将使用时间戳或其他数据加密,并且将存储在本地计算机上,而不是存储在服务器上或服务器可识别存储器中,除非它用于解密私钥。将创建软件算法以检索与该用户相关联的加密主解密密钥的解密密钥。

因此,可以根据管理员的意愿创建和撤销用户。用户可以重置他们的短语 - 但在这种情况下,需要发布新的解密密钥,因为旧的解密密钥不再可解密。

我看到的一个漏洞,我打开输入,是管理员忘记了他们的密码并且不能再发出私钥。我们可以编写给用户密码的代码,恢复私钥并在输入时使用管理员新密码对其进行加密。

另一个薄弱环节是用户密码短语。如果它受到损害,那么开发人员可以使用它来获取私有描述密钥的副本并解密数据。

此外 - 如果出于某种原因管理员需要放手,我们会遇到与上述相同的问题,即我们没有可供共享的私钥副本,但我们可以使用用户密码短语。

有关克服所察觉的弱点的任何建议吗?

我们不能容忍主解密私钥的暴露 - 如果它被暴露,那么整个数据库需要使用新的密钥对重新加密。

感谢您的评论。

2 个答案:

答案 0 :(得分:0)

如果您需要保护自己的数据,唯一的选择是端到端加密。用户有一个私钥,它永远不会离开他们的计算机。 Devs / sysadmins永远不会拥有私钥,也永远无法解密。

这将要求您向用户提供您的客户端软件源,以便他们可以看到您没有泄露他们的信息。

使用USB智能卡可以更轻松,更安全地进行密钥管理。它们的密钥是在智能卡上生成的,永不离开。智能卡代表您的应用进行解密。

这会让搜索变得更难,但你可以通过在加密值中存储哈希值并搜索它们来解决其中一些问题。

更新,在评论中回答您的问题:

  1. 基于网络不是一种选择。你需要一个胖客户端
  2. 没有“万能钥匙”
  3. 请澄清“授权用户”。由谁授权?请举个例子。
  4. 另一种选择是完全跳过加密并完全依赖访问控制。使用像postgresql,ms sql或oracle那样执行行级安全性的db。不要授予任何一个DBA访问权限。将一部分密码提供给一个dba,另一部分提供给另一个。 DBA需要在同一个房间才能访问服务器。

    无论哪种方式,您都应该熟悉https://en.wikipedia.org/wiki/Secret_sharing

答案 1 :(得分:0)

如果您使用SQL Server而不是mysql,那么我能想到的最符合您要求的安全设计是要求SQL Server Enterprise Edition使用硬件安全模块的可扩展密钥管理系统。 SQL Server可扩展密钥管理使保护数据库文件的加密密钥能够存储在远程设备中,例如智能卡,USB设备或EKM / HSM模块。 EKM仅在企业版中受支持。如果这是您的意图,HSM将允许在除开发人员和DBA之外的组下管理加密密钥和功能的委派和隔离。我在设计中建议的其他功能包括以下选项来完成端到端传输\会话加密:

  • 在SQL Server上安装域或CA证书并启用强制协议加密或在实例主机上启用IPSec
  • 在所有IIS网站或Web服务上安装域或CA证书,并在连接字符串和https中强制加密

此设计优于SQL Server Always Encrypted的好处是,加密受单个系统的保护,可以通过更多关注来监控和防御,而不是大量客户端增加了私钥被盗的风险。用户密钥库。此外,对于管理系统的人来说,EKM的关键轮换应该很容易。 EKM也可以要求不止一个人参与生成密钥。