嵌入式数据库和加密

Posted

技术标签:

【中文标题】嵌入式数据库和加密【英文标题】:Embedded Database and Encryption 【发布时间】:2017-01-28 14:33:11 【问题描述】:

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

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

非常感谢您的帮助! :)

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

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

【讨论】:

以上是关于嵌入式数据库和加密的主要内容,如果未能解决你的问题,请参考以下文章

生成独立加密、可分发的 Web 应用程序的 Web 框架?

基于C语言的AES加密算法实现

基于C语言的AES加密算法实现

C#访问加密的SQLite数据库

Android SQLite数据库加密

Android SQLite数据库加密