这是事情:
在我的Qt4.6-Project中,我使用了一个SQLite-Database。这个数据库不应该在我的硬盘上解密。所以我想,在程序的每次启动时,都会要求用户输入密码来解密数据库。当然,数据库永远不应该在我的硬盘上“清晰”(未加密)出现
那么有没有可能“动态”解密SQLite数据库并读写数据?这里的算法最好(也许是AES)?
当它不可能(或非常慢)时,也许最好加密数据库中的每个字符串并在密码正确时解密字符串(这样用户可以打开数据库,但不知道所有的意思可能意味着什么) ?
答案 0 :(得分:13)
没有内置的支持,据说你确实有选择。
1)您可以自己加密/解密所有字符串,但这是很多工作,不透明,不允许您在数据库中进行搜索等操作。
2)SQLiteCrypt和SQLCipher做你想要的。
您可以使用它们几乎完全透明,并且通常认为与没有加密相比,它们仅有大约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贡献了编解码器。