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

8
我已经在我的Android应用程序中实现了SQLCipher,以使其数据库更加安全。 SQLCipher需要一个密钥来加密数据库文件。我面临的问题是密钥保护,如果我的应用程序在rooted设备上使用或被反向工程,则我的密钥将被暴露,数据库可以被解密。
请注意,我的应用程序不会要求用户每次打开它时输入密码,因此无法使用用户输入的密码作为密钥。我想实现像Facebook,WhatsApp应用程序一样的行为,使用私钥/密钥加密数据而不要求任何密码,并始终保持用户登录状态。这些应用程序在哪里以及如何存储它们的密钥?
请提供一种解决方案/算法来保护密钥。此外,Android操作系统是否提供类似的数据保护/管理功能?

1
Talha的解决方案的一个附加组件:您可以使用Jetpack库中的EncryptedSharedPreferences。 - Steven Ng
2个回答

9
你可以使用Android Keystore来加密你的SQLCipher密码。
我曾经遇到了同样的问题,即使用SQLCipher来保护数据,但密码本身并没有被保护。这导致一个安全漏洞,简单的反编译就会揭示密码,因为它是以字符串常量的形式存在的。
我的解决方案如下:
  • 在应用程序首次启动时生成一个随机数。(您可以根据需要更改此行为)
  • 使用Android Keystore加密该数字。
  • 一旦加密,该数字的原始形式就消失了。
  • 将其保存在Prefs中。
  • 现在,每当SQLCipher需要密码时,它会解密并使用它。
  • 由于Android Keystore在运行时提供密钥,而且密钥严格属于应用程序特定,因此破解这个数据库将变得更加困难。
  • 虽然一切都可能被破解,但这种方法将使攻击者更难从DB或DB密码中检索数据。
这里有一个我制作的示例项目,其中也有与你相同的SQLCipher用例。 加密助手用于加密密码 SQLCipher用例 请注意,上述讨论中作为加密密钥的术语在DB中被用作密码/数字。

当您使用AndroidKeystore加密数字时,您的Android密钥库使用了哪个证书? - Syed Taruf Naqvi
1
密钥库必须具有其默认证书,因为我没有在以下文件的开头指定它,您可以检查此源代码,其中包含证书颁发机构和使用的算法等声明:https://github.com/talhahasanzia/android-encryption-helper/blob/master/encryption-helper/src/main/java/com/thz/keystorehelper/KeystoreHelper.java。 - Talha
1
看一下这个:Java Keytool的工作原理 - Talha
您的用例链接已损坏。 - Yoann Hercouet
1
更新了链接* - Talha
1
很好地解释了。 - sandulasanth-7

-1

个人而言,我使用子字符串从字符串值中选择序列或唯一字符,然后将它们连接起来以获得我的键。这种方法可能有些原始,但我还没有找到其他更有效的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接