嵌入式数据库和加密

Embedded Database and Encryption

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

我更喜欢基于文件的加密:如果我使用文件加密,是否可以在不将解密文件物理存储在硬盘上的情况下使用嵌入式数据库?这个要求有意义吗?我的意思是,如果我的计算机被攻击者破坏,存储在数据库中的数据在某种程度上是可读的,对吧?另一方面,如果不需要创建数据库的解密副本会很好(考虑硬盘或性能上的space)。

非常感谢您的帮助! :)

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

我现在使用 HSQLDB 及其 built-in 使用 AES-128(以及其他如 Blowfish)的加密。当一个打开的连接存在时,HSQLDB 创建不同的文件。

如果使用HSQLDB的加密机制,文件是用生成的私钥加密的。这一代在每个 运行.

上创建了一个单独的 32-character-wide 密钥

为了保护这个密钥和其他文件,我首先将整个文件夹和数据库文件打包到一个 zip-File 中。在下一步中,我使用用户在登录屏幕上输入的密码加密此文件。这个密码不会被物理保存。对于 en-/decryption 我使用了充气城堡的 AES-implementation Java 密码学 API.

详细加密: 1. 使用 AES 的 KeyGenerator 创建随机初始化向量(IV;16 字节)、带有 SecureRandom-Class 的盐(8 字节)和数据加密密钥(DEK;16 字节)。 2. 使用输入的密码和盐创建 32 Byte-long PBKDF2-Key,并将其拆分为验证密钥(VK;16 字节)和密钥加密密钥(KEK;16 字节)。 3. 将存放数据库文件的文件夹打包成一个zip-file,并用DEK和AES-Provider加密这个文件的字节。 4. 通过 AES-Provider 使用 KEK 和 IV 加密 DEK。 5. 将IV、Salt、DEK、VK存放在加密后的开头zip-File。如果您另外使用数据库内部加密,您会得到一个 CRYPT_KEY,它也存储在 zip-file.

最后我在每次关闭应用程序时删除数据库文件。

如果您有任何建议可以降低此过程的脆弱性,请不要犹豫写下来。我将非常高兴获得如何改进所描述过程的安全方面的想法!