H2数据库:如何使用加密进行保护,而无需公开文件加密密钥

问题描述:

我们在服务器模式下使用Java + H2数据库,因为我们不希望用户访问数据库文件。H2数据库:如何使用加密进行保护,而无需公开文件加密密钥

为了给数据库文件增加更多保护,我们计划在存储被盗的情况下使用AES加密(将CIPHER = AES添加到数据库URL)。

但是,连接时([文件密码] [空格] [用户密码]),每个用户还需要提供文件保护密码。

虽然用户无法访问数据库文件,但知道加密密钥(文件保护密码)会使加密无用。

任何想法保持数据库文件的安全(加密),而不暴露文件加密密钥给用户?

谢谢。

+0

这是如何具体到H2? – trashgod 2011-05-27 06:16:42

在H2内目前没有办法做到这一点。

一种解决方案是使用独立于H2的文件系统加密。

但是请注意,在某些时候,您将不得不提供(数据库文件或文件系统)密码。这可能是启动服务器时(提示手动输入密码)。不幸的是,由于有人不得不输入密码,因此无法完全自动启动服务器。

+0

用户可能会窃取数据库存储设备。 – Andy 2011-05-27 07:40:26

+0

我明白了。不幸的是,H2目前没有功能来做你想做的事情。我将添加一个功能请求。 – 2011-05-27 07:44:35

+0

非常感谢Thomas。可能会脱离主题,但是您是否知道另一种解决方法或其他数据库系统?或者它是由许多数据库系统共享的常见问题? – Andy 2011-05-27 08:07:05

我听说过的一个聪明的方法是编写一个简单的web服务来阻止所有的站点,但是你的webapp的服务器。将SSL用于基于证书的身份验证。

此webservice提供加密密钥。

这听起来很愚蠢,因为它似乎提供没有身份验证的密钥,但基于证书的身份验证涵盖了这一点。它在传输过程中提供了密钥的加密(如果你真的偏执,你可以使用共享密钥来包装数据库密钥)。它只能从webapp的服务器调用,并且触发webservice调用比执行SQL注入甚至查看文件系统要困难得多。

如果您的风险模型允许,您甚至可以在与您的web应用程序相同的框中运行此webservice。

第二种方法(如果您拥有必要的权限)是创建一个虚拟磁盘。将密钥放在虚拟磁盘上。

在启动过程中,您将挂载虚拟磁盘,读取加密密钥,然后卸载虚拟磁盘。在某些设计中,您可以放弃允许您挂载虚拟磁盘的操作系统权限 - 然后攻击者通过web应用程序读取密钥实际上是不可能的。

这来自一个更旧的策略,它从CD-ROM(甚至是软盘)读取敏感信息。该应用程序将读取密钥,然后弹出媒体。它可以工作,但需要人工干预才能在下次重新启动之前重新加载介质。它也不适用于服务器没有CD-ROM的现代环境,更不用说软盘驱动器。