有人在Monotouch的sqlite数据库上成功使用过密码吗?

时间:2010-11-18 19:10:28

标签: sqlite xamarin.ios

我有一个使用sqlite数据库的Monotouch应用程序。我想加密数据库所以我这样做:

_mainConnection = new SqliteConnection("Uri="+finalDB);
_mainConnection.Open();
_mainConnection.ChangePassword("mypassword");

然而,它不工作(在模拟器和iPhone上)。它收到了这个错误:

  

at(包装器托管到原生)   Mono.Data.Sqlite.UnsafeNativeMethods.sqlite3_rekey   (intptr,byte [],int)< 0x0005c>在   (包装器管理到本机)   Mono.Data.Sqlite.UnsafeNativeMethods.sqlite3_rekey   (intptr,byte [],int)< 0x0005c>在   Mono.Data.Sqlite.SQLite3.ChangePassword   (byte [])< 0x00053>在   Mono.Data.Sqlite.SqliteConnection.ChangePassword   (byte [])< 0x0004b>在   Mono.Data.Sqlite.SqliteConnection.ChangePassword   (字符串)< 0x0005b>

有没有人在Monotouch的sqlite数据库上成功使用过密码保护?

6 个答案:

答案 0 :(得分:3)

根据我的研究,使用MonoTouch进行数据库加密有几种选择。我有一篇关于这个主题的博客文章,但是现在这些是你的两个最佳选择:

SQLCipher

我已经大大自动化了SQLCipher构建过程。所需要的只是一个简单的make命令,你有一个可以链接到你的项目的库。它利用了令人敬畏的SQLite-NET库。之后,所需的只是在SQLite.cs文件中提供密钥。

CSHARP-SQLite的

这是C#中SQLite库的托管端口。性能只差大约2倍,考虑到它不是本机代码,这非常棒!

答案 1 :(得分:1)

尝试在您的连接字符串中添加“; Password = mypassword”,然后删除对ChangePassword的调用。

请注意,默认情况下,sqlite的iPhone实现不支持加密,因此sqlite命令将是no-ops。

您可以从http://www.hwaci.com/sw/sqlite/see.html获取可加密版本的sqlite的(付费)副本,并将其编译到您的应用程序中,确保在您链接时从项目中删除libsqlite3 * .dylib那个。

您可能需要在Monotouch文档和/或实验中进行一些挖掘,以确保Monotouch库本身不包含默认的sqlite实现,但实际上是指向您指定的实现的链接。首先尝试一下,如果事情仍然不起作用,那就是我开始寻找的地方。

您可以在不支付加密版本的情况下执行此实验,只需使用网络上提供的sqlite3源代码,并提供适当的断点。

祝你好运!

PS:请注意,目前还没有针对Android的可比解决方案,这适用于iPhone,因为iPhone运行原生C代码。

PPS:还有SQLCipher声称在iPhone上加密sqlite。但是为了简单起见,我发现配置要求低于我的标准。我也不确定它是否会在Monotouch的框架代码和默认的iPhone sqlite实现之间正确插入。

答案 2 :(得分:1)

MonoTouch的SQLCipher为SQLite数据库提供完整的数据库加密。

http://sqlcipher.net/sqlcipher-for-monotouch

Android版Mono上还有一个SQLCipher,允许您在Mono Touch和MonoDroid应用程序中重复使用相同的代码

http://sqlcipher.net/sqlcipher-for-monodroid

答案 3 :(得分:0)

只是大声思考,但这可能是因为iPhoneSDK附带的sqlite的dynlib不是线程安全的吗?

对于替代方案,您可以尝试查看WWDC Vid 209,并在应用程序外部时锁定/加密数据库。

答案 4 :(得分:0)

您可以通过在原始SQLite查询中发出“pragma rekey”来自行完成 - 也就是说,如果安装的SQLite版本实际上是SqlCipher。

答案 5 :(得分:0)

我遇到了同样的问题,但在C#中有一个Windows窗体应用程序。 我找不到解决方案,因此我必须在保存时手动加密我的数据并在检索时解密。