加密/解密SQLite数据库并“在运行中”使用它

时间:2010-04-03 15:11:19

标签: c++ qt sqlite encryption qt4

这是事情: 在我的Qt4.6-Project中,我使用了一个SQLite-Database。这个数据库不应该在我的硬盘上解密。所以我想,在程序的每次启动时,都会要求用户输入密码来解密数据库。当然,数据库永远不应该在我的硬盘上“清晰”(未加密)出现 那么有没有可能“动态”解密SQLite数据库并读写数据?这里的算法最好(也许是AES)?
当它不可能(或非常慢)时,也许最好加密数据库中的每个字符串并在密码正确时解密字符串(这样用户可以打开数据库,但不知道所有的意思可能意味着什么) ?

4 个答案:

答案 0 :(得分:13)

没有内置的支持,据说你确实有选择。

1)您可以自己加密/解密所有字符串,但这是很多工作,不透明,不允许您在数据库中进行搜索等操作。

2)SQLiteCryptSQLCipher做你想要的。

您可以使用它们几乎完全透明,并且通常认为与没有加密相比,它们仅有大约5%的开销。

答案 1 :(得分:4)

我建议使用一个为您执行此操作的库,而不是使用您自己的加密。

http://www.hwaci.com/sw/sqlite/see.html 要么 http://sqlite-crypt.com/documentation.htm

使用您最喜欢的搜索引擎来寻找其他选择。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

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

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