如何在 Android 中保护我的加密密钥?

How to protect my encryption key in Android?

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

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

请建议 solution/algorithm 来保护 key.Also,Android OS 是否为数据 protection/management 提供任何此类功能?

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

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

我的解决方案是:

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

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

Encryption Helper for Encrypting Passwords

Use case for SQLCipher

请注意,您用作加密密钥的术语在上述讨论中用作数据库的 password/number。

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