Java 嵌入式数据库与加密

Java 嵌入式数据库与加密,java,database,encryption,embedded-database,Java,Database,Encryption,Embedded Database,我想创建一个开源应用程序,其中用户特定的数据存储在嵌入式数据库中(例如SQLite、H2、HSQLDB)。此外,还有一个登录屏幕,用户必须在其中输入加密数据库的密码。但我还不确定如何处理加密:只由数据库和/或由例如BouncyCastle处理整个文件加密 我更喜欢基于文件的加密:如果我使用文件加密,是否可以在不将解密文件物理存储在硬盘上的情况下使用嵌入式数据库?这个要求有意义吗?我的意思是,如果我的电脑被攻击者破坏,数据库中存储的数据以某种方式或其他方式是可读的,对吗?另一方面,如果不需要创建数

我想创建一个开源应用程序,其中用户特定的数据存储在嵌入式数据库中(例如SQLite、H2、HSQLDB)。此外,还有一个登录屏幕,用户必须在其中输入加密数据库的密码。但我还不确定如何处理加密:只由数据库和/或由例如BouncyCastle处理整个文件加密

我更喜欢基于文件的加密:如果我使用文件加密,是否可以在不将解密文件物理存储在硬盘上的情况下使用嵌入式数据库?这个要求有意义吗?我的意思是,如果我的电脑被攻击者破坏,数据库中存储的数据以某种方式或其他方式是可读的,对吗?另一方面,如果不需要创建数据库的解密副本(想想硬盘上的空间或性能),那就好了


非常感谢您的帮助!:)

好的,我现在通过以下过程解决了我的问题:

我现在使用HSQLDB及其内置的AES-128加密(以及其他类似Blowfish的加密)。HSQLDB在存在打开的连接时创建不同的文件

如果使用HSQLDB的加密机制,则使用生成的私钥对文件进行加密。该生成在每次运行时创建一个单独的32字符宽的密钥

为了保护这个密钥和其他文件,我首先将包含数据库文件的整个文件夹打包到一个zip文件中。在下一步中,我使用用户在登录屏幕上输入的密码对该文件进行加密。此密码不会以物理方式保存。对于en-/解密,我使用Bouncy Castle Java加密API的AES实现

有关加密的详细信息: 1.使用SecureRandom类创建随机初始化向量(IV;16字节)、Salt(8字节),并使用KeyGenerator为AES创建数据加密密钥(DEK;16字节)。 2.使用输入的密码和salt创建32字节长的PBKDF2密钥,并将其拆分为验证密钥(VK;16字节)和密钥加密密钥(KEK;16字节)。 3.将保存数据库文件的文件夹打包为zip文件,并使用DEK和AES提供程序对此文件的字节进行加密。 4.AES提供商使用KEK和IV加密DEK。 5.将IV、Salt、DEK和VK存储在加密zip文件的开头。如果您另外使用数据库内部加密,您将获得一个CRYPT_密钥,该密钥也存储在zip文件中

最后,每次关闭应用程序时,我都会删除数据库文件

如果你有任何建议,使这个过程不那么容易受到攻击,请不要急于写信。我将非常乐意获得如何改进所描述过程的安全方面的想法