H2 database: how to protect with encryption, without exposing file encryption key
我们在服务器模式中使用Java+H2数据库,因为我们不希望用户访问数据库文件。
为了增加对数据库文件的保护,我们计划使用aes加密(在数据库URL中添加cipher=aes),以防存储被盗。
但是,每个用户在连接时还需要提供文件保护密码([文件密码][空间][用户密码])。
虽然用户没有访问数据库文件的权限,但是知道加密密钥(文件保护密码)会使加密变得非常无用。
有没有办法在不向用户公开文件加密密钥的情况下保持数据库文件的安全性(加密)?
谢谢您。
目前还没有办法在h2内做到这一点。
一种解决方案是使用独立于h2的文件系统加密。
但请注意,在某些情况下,您必须提供(数据库文件或文件系统)密码。这可能是在启动服务器时(提示手动输入密码)。不幸的是,因为有人必须输入密码,所以您无法完全自动启动服务器。
我听说过的一个聪明的方法是编写一个简单的WebService,它可以阻止除WebApp服务器之外的所有站点。使用基于证书的身份验证的SSL。
此Web服务提供加密密钥。
这听起来很愚蠢,因为它似乎提供了没有身份验证的密钥,但是基于证书的身份验证就涵盖了这一点。它在传输过程中提供密钥加密(如果您真的是偏执狂,可以使用共享密钥来包装数据库密钥)。它只能从webapp的服务器调用,而且触发webservice调用要比执行SQL注入甚至查看文件系统困难得多。
如果您的风险模型允许,您甚至可以在与webapp相同的框中运行此webservice。
如果您有必要的权限,第二种方法是创建虚拟磁盘。将密钥放在虚拟磁盘上。
在启动过程中,您装载虚拟磁盘,读取加密密钥,然后卸载虚拟磁盘。在某些设计中,您可以删除允许您装载虚拟磁盘的操作系统权限,这样攻击者就不可能通过您的webapp读取密钥。
这来自一个更古老的策略,它从CD-ROM(甚至软盘)中读取敏感信息。应用程序将读取密钥,然后弹出媒体。它可以工作,但需要手动干预才能在下次重新启动之前重新加载媒体。它也不能在现代环境中工作,在现代环境中,服务器没有CD-ROM,更不用说软盘驱动器了。