Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 加密/解密SQLite数据库并使用它;“在飞行中”;_C++_Qt_Sqlite_Encryption_Qt4 - Fatal编程技术网

C++ 加密/解密SQLite数据库并使用它;“在飞行中”;

C++ 加密/解密SQLite数据库并使用它;“在飞行中”;,c++,qt,sqlite,encryption,qt4,C++,Qt,Sqlite,Encryption,Qt4,事情是这样的: 在我的Qt4.6项目中,我使用了一个SQLite数据库。这个数据库不应该在我的硬盘上解密。所以我想,在我的程序每次启动时,用户都会被要求输入密码来解密数据库。当然,数据库永远不应该在我的硬盘上显示为“透明”(未加密)。 那么,是否有可能“动态”解密SQLite数据库并读取和写入数据?这里哪种算法最好(可能是AES)? 如果不可能(或者速度很慢),可能最好加密数据库中的每个字符串,并在密码正确时解密字符串(这样用户可以打开数据库,但不知道所有的入口可能意味着什么)?我能想到的最好方

事情是这样的: 在我的Qt4.6项目中,我使用了一个SQLite数据库。这个数据库不应该在我的硬盘上解密。所以我想,在我的程序每次启动时,用户都会被要求输入密码来解密数据库。当然,数据库永远不应该在我的硬盘上显示为“透明”(未加密)。
那么,是否有可能“动态”解密SQLite数据库并读取和写入数据?这里哪种算法最好(可能是AES)?

如果不可能(或者速度很慢),可能最好加密数据库中的每个字符串,并在密码正确时解密字符串(这样用户可以打开数据库,但不知道所有的入口可能意味着什么)?

我能想到的最好方法是使用Linux可用的“用户域中的文件系统”,Mac OS X和其他系统,或不同的加密文件系统。这将使SQLite在磁盘上进行物理加密时将其视为未加密。通过使用权限,您可以确保用户无法访问未加密的文件系统


我不确定SQLite是否有办法超越低级读/写例程,这将允许您在没有文件系统游戏的情况下动态实现加密。至少我不需要这样做。您可能希望搜索此类功能请求,如果它不在SQLite问题跟踪器中,则将其归档。

没有内置支持,也就是说您有选项

1) 您可以自己对所有字符串进行加密/解密,但这需要大量的工作,不透明,并且不允许您在数据库中进行搜索等操作

2) 做你想做的事


您几乎可以完全透明地使用它们,通常说,与不加密的情况相比,它们的开销只有大约5%

我建议使用一个库来为您实现这一点,而不是构建您自己的加密


使用您喜爱的搜索引擎寻找一些替代方案。

另一个选项是Botan 1.9.x(src/wrap/SQLite)附带的SQLite加密编解码器

该选项使您能够在编译时自定义加密类型,包括密码和模式


披露:我将编解码器贡献给了Botan。

但是当我使用不同的API时,我不再具有Qt和SQLite的“可用性”,对吗?@Berschi:你可能需要在Qt中重建SQLite组件,但它们提供了这样的源代码。我认为尝试使用其中一个组件将是最好的选择。您应该能够使用sqllite驱动程序,并根据SqlLitCrypt或SQLCipher提供的sqllite进行编译。您可能会在连接字符串中嵌入一些密码工具,或者扩展驱动程序类并直接调用驱动程序来实现扩展函数