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

时间:2018-03-07 06:33:46

标签: android public-key-encryption sqlcipher-android

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

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

请建议一个能够保护密钥的解决方案/算法。此外,Android操作系统是否为数据保护/管理提供了任何此类功能?

2 个答案:

答案 0 :(得分:6)

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

前一段时间我遇到了同样的问题,其中SQLCipher用于保护数据,但密码本身并非如此。这允许一个安全漏洞,其中一个简单的反编译将显示密码,因为它是字符串常量的形式。

我的解决方案是:

  • 首次启动应用时生成一个随机数。 (您可以针对任何适合您的行为更改此行为)
  • 使用Android Keystore加密此号码。
  • 该号码的原始格式一旦加密就会消失。
  • 将此保存在Prefs。
  • 现在,只要SQLCipher需要密码,它就会解密并使用它。
  • 由于Android Keystore在运行时提供密钥,并且密钥严格依赖于应用程序,因此很难破坏此数据库。
  • 虽然一切都可以破解但是这种方法会让攻击者更难以从数据库或数据库密码中检索数据。

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

Encryption Helper for Encrypting Passwords

Use case for SQLCipher

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

答案 1 :(得分:-1)

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