7

我已SQLCipher在我的 Android 应用程序中实现以使其数据库安全。SQLCipher需要一个密钥来加密数据库文件。我面临的问题是密钥保护,如果我的应用程序在有根设备上使用或被反向工程,那么我的密钥将被暴露并且数据库可以被解密。

请注意,我的应用程序不会在每次用户打开它时都要求输入密码,因此用户输入的密码不能用作密钥。我想实现像 facebook、whatsapp 应用程序这样的行为,它使用私钥/密钥加密数据而不询问任何密码,并使用户始终保持登录状态。这些应用程序在哪里以及如何存储它们的密钥?

请提出一个可以保护密钥的解决方案/算法。此外,Android OS 是否提供任何此类数据保护/管理功能?

4

2 回答 2

7

您可以使用 Andriod Keystore 来加密您的 SQLCipher 密码。

我之前遇到过同样的问题,SQLCipher 用于保护数据,但密码本身不是。这导致了一个安全漏洞,其中简单的反编译会以字符串常量的形式显示密码。

我的解决方案是:

  • 应用程序首次启动时生成一个随机数。(您可以根据自己的喜好更改此行为)
  • 使用 Android Keystore 加密此号码。
  • 一旦加密,数字的原始形式就消失了。
  • 将此保存在首选项中。
  • 现在,只要 SQLCipher 需要密码,它就会解密并使用它。
  • 由于 Android Keystore 在运行时提供密钥,并且密钥是严格特定于应用程序的,因此很难破坏这个数据库。
  • 尽管一切都可以被破坏,但这种方法将使攻击者更难从数据库中检索数据或数据库密码。

这是我制作的一个示例项目,它也有一个与您相同的 SQLCipher 用例。

用于加密密码的加密助手

SQLCipher 的用例

请注意,您用作加密密钥的术语在上述讨论中用作 DB 的密码/编号。

于 2018-03-07T06:41:07.020 回答
-1

就个人而言,我使用子字符串从字符串值中选择序列或唯一字符,然后将其连接起来以获取我的密钥,这很野蛮,但我没有找到其他有效的解决方案。

于 2018-04-23T17:39:47.847 回答