嵌入式数据库和加密

时间:2017-01-28 14:33:12

标签: java database encryption embedded-database

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

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

非常感谢您的帮助! :)

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

如果你有任何建议让这个过程不那么脆弱,请不要犹豫写。我非常想知道如何改进所描述过程的安全性方面!