【问题标题】:How to pass password to sqlcipher ContentProvider如何将密码传递给 sqlcipher ContentProvider
【发布时间】:2016-05-18 21:50:29
【问题描述】:

我正在尝试在我的应用中实现一个安全数据库,该数据库要求用户在应用启动时输入密码。他们输入的密码用于解密包含他们数据的 sqlcipher 数据库。我被难住的部分是如何将密码传递给内容提供者。

现在我将密码临时存储在共享首选项中,以便我的内容提供者访问它,然后在我的 MainActivity 中调用 onStop 时删除共享首选项。但是,一旦我介绍了多个活动,这似乎过于复杂。有没有更有效的方法来为我的 sqlcipher ContentProvider 设置密码,只是为当前的应用程序会话?

【问题讨论】:

  • 欢迎来到 StackOverflow。请花点时间阅读how to ask a good question 上的提示。问一个好问题可以提高你得到答案的机会。同样重要的是,在您发布问题之前,您首先要进行一些搜索 - 并指出您迄今为止在您的产品上尝试过的内容。这为社区成员提供了一些关于您已经探索过哪些解决方案的想法。

标签: android android-contentprovider password-protection sqlcipher


【解决方案1】:

我被难住的部分是如何将密码传递给内容提供者。

选项#1:不要使用ContentProvider

选项#2:在ContentResolver 上使用call(),这反过来又在您的ContentProvider 上调用call()。这是一条临时通信路径,您可以在其中定义基本含义。您可以将其用作“设置密码”类型的机制,您的 UI 层收集密码并通过call() 将其传递给提供者。请注意,这需要 minSdkVersion 为 11 或更高。

在这两者中,我强烈推荐选项 #1。

现在我将密码临时存储在共享首选项中,以便我的内容提供者访问它,然后在我的 MainActivity 中调用 onStop 时删除共享首选项。

这会将密码以明文形式写入磁盘。 请不要这样做

【讨论】:

  • 感谢您的快速回复!如果我走不使用ContentProvider 的道路,您是否建议将我当前的ContentProvider 类转换为实用程序类以避免在我的片段中编写数据库调用?
  • @DillonConnolly:这很难抽象地回答。有些人将该代码放在SQLiteOpenHelper 上。有些有一个实用程序类。那些使用 ORM 的人通常两者都没有,因为 ORM 或多或少地扮演了这个角色。在您的情况下,关键是您将自己设置为能够在获得密码时打开数据库,并安全地确保您在此之前不要尝试使用数据库。
猜你喜欢
  • 2022-01-12
  • 2011-02-23
  • 2013-06-23
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
相关资源
最近更新 更多