2010-04-03 58 views
9

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

回答

11

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

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

2)SQLiteCrypt and SQLCipher做你要找的东西。

你可以使用它们几乎是完全透明的,通常他们被认为只有5%的开销比没有加密。

+0

但是当我使用不同的API时,我没有Qt和SQLite的“可用性”了,对吗? – Berschi 2010-04-03 15:27:46

+1

@Berschi:你可能不得不重建Qt中的sqlite组件,但它们提供了像这样的需求的来源。我认为尝试使用这些组件中的一个将是您最好的选择。 – 2010-04-03 15:30:12

+0

您应该能够使用sqllite驱动程序并针对由SqlLitCrypt或SQLCipher提供的sqllite进行编译。您可能可以在连接字符串中嵌入一些密码功能,或者扩展驱动程序类并直接调用驱动程序以获取扩展功能 – 2010-04-07 01:20:16

2

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

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

1

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

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

披露:我向Botan提供了编码解码器。