我想创建一个开源应用程序,其中用户特定的数据存储在一个嵌入式数据库中(例如sqlite、h2、hsqldb)。此外,还有一个登录屏幕,用户必须输入加密数据库的密码。但我还不确定如何处理加密:只由数据库和/或通过例如bouncyCastle的整个文件加密来处理?
我更喜欢基于文件的加密:如果我使用文件加密,是否可以在不将解密文件物理存储在硬盘上的情况下使用嵌入式数据库?这个要求有意义吗?我的意思是,如果我的计算机被攻击者破坏了,数据库中存储的数据是可读的,对吧?另一方面,如果不需要创建数据库的解密副本(考虑硬盘上的空间或性能),那就更好了。
非常感谢您的帮助!:)
最佳答案
好的,我现在通过以下过程解决了我的问题:
我现在使用hsqldb和它的内置加密与aes-128(和其他像blowfish)。HQLDB在打开连接存在时创建不同的文件。
如果使用hsqldb的加密机制,则使用生成的私钥对文件进行加密。这一代在每次运行时创建一个单独的32字符宽的密钥。
为了保护这个密钥和其他文件,我首先将整个文件夹和数据库文件打包到一个zip文件中。在下一步中,我用用户在登录屏幕上输入的密码加密这个文件。此密码不会以物理方式保存。对于en-/解密,我使用bouncy castle java密码api的aes实现。
加密细节:
一。使用securerandom类创建随机初始化向量(iv;16字节)、salt(8字节)和使用keygenerator for aes创建数据加密密钥(dek;16字节)。
2.使用输入的密码和salt创建32字节长的pbkdf2密钥,并将其拆分为验证密钥(vk;16字节)和密钥加密密钥(kek;16字节)。
三。将保存数据库文件的文件夹打包成zip文件,并使用dek和aes提供程序加密该文件的字节。
四。由aes提供程序使用kek和iv加密dek。
5个。在加密zip文件的开头存储iv、salt、dek和vk。如果另外使用数据库内部加密,则会得到一个crypt_密钥,该密钥也存储在zip文件中。
最后,每次关闭应用程序时,我都会删除数据库文件。
如果你有任何建议,使这个过程不那么脆弱,请不要急于写信。我会非常高兴地得到如何改进描述过程的安全方面的想法!