【问题标题】:Anyone successfully used password on sqlite database in Monotouch?有人在 Monotouch 的 sqlite 数据库上成功使用过密码吗?
【发布时间】:2010-11-18 19:10:27
【问题描述】:

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

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

但是,它不起作用(在模拟器和 iphone 上)。它得到这个错误:

at(包装器托管到本机) Mono.Data.Sqlite.UnsafeNativeMethods.sqlite3_rekey (intptr,byte[],int) 在 (包装器托管到本机) Mono.Data.Sqlite.UnsafeNativeMethods.sqlite3_rekey (intptr,byte[],int) 在 Mono.Data.Sqlite.SQLite3.ChangePassword (byte[]) 在 Mono.Data.Sqlite.SqliteConnection.ChangePassword (byte[]) 在 Mono.Data.Sqlite.SqliteConnection.ChangePassword (字符串)

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

【问题讨论】:

  • 您试过查看 Vici.Coolstorage 吗?他们有一个 Monotouch 分支,可以在 iphone 上加密 sqlite db 的内容方面创造奇迹。虽然,我不知道它会允许您对数据库本身进行密码保护,但它仍然可能是一个合适的选择。
  • 除非 iphone 连接到与 SQL Server 相同的 VPN,否则您需要找到加密和解密的方法
  • 您很可能会收到此错误,因为 iOS SQLite 不附带该本机功能。我在下面的回答中提供了一些用于 SQLite 数据库加密的替代机制。不支持的功能:docs.xamarin.com/ios/advanced_topics/…

标签: sqlite xamarin.ios


【解决方案1】:

根据我的研究,有几个使用 MonoTouch 进​​行数据库加密的选项。我有一篇关于这个主题的博文即将发表,但现在这是你最喜欢的两个选择:

SQLCipher

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

CSharp-SQLite

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

【讨论】:

  • 您的 SQLCipherNet 存储库不再存在...您对答案的那一部分有更新吗?
【解决方案2】:

尝试将“;Password=mypassword”添加到您的连接字符串,并删除对 ChangePassword 的调用。

请注意,默认情况下,SQLite 的 iPhone 实现不支持加密,因此用于加密的 sqlite 命令将是无操作的。

您可以从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 实现之间正确插入。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-31
          • 2023-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-28
          • 1970-01-01
          相关资源
          最近更新 更多