我有一个使用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数据库上成功使用过密码保护?
答案 0 :(得分:3)
根据我的研究,使用MonoTouch进行数据库加密有几种选择。我有一篇关于这个主题的博客文章,但是现在这些是你的两个最佳选择:
我已经大大自动化了SQLCipher构建过程。所需要的只是一个简单的make
命令,你有一个可以链接到你的项目的库。它利用了令人敬畏的SQLite-NET库。之后,所需的只是在SQLite.cs文件中提供密钥。
这是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应用程序中重复使用相同的代码
答案 3 :(得分:0)
只是大声思考,但这可能是因为iPhoneSDK附带的sqlite的dynlib不是线程安全的吗?
对于替代方案,您可以尝试查看WWDC Vid 209,并在应用程序外部时锁定/加密数据库。
答案 4 :(得分:0)
您可以通过在原始SQLite查询中发出“pragma rekey”来自行完成 - 也就是说,如果安装的SQLite版本实际上是SqlCipher。
答案 5 :(得分:0)
我遇到了同样的问题,但在C#中有一个Windows窗体应用程序。 我找不到解决方案,因此我必须在保存时手动加密我的数据并在检索时解密。