我在我的
Android应用程序中实现了sqlCipher,使其数据库安全. sqlCipher需要一个密钥来加密数据库文件.我面临的问题是密钥保护,如果我的应用程序在root设备上使用或者是逆向工程,那么我的密钥将被公开并且数据库可以被解密.
请注意,我的应用程序不会在每次用户打开时询问密码,因此用户输入的密码不能用作密钥.我想实现像facebook,whatsapp应用程序这样的行为,它使用私钥/密钥加密数据而不需要任何密码并让用户始终保持登录状态.这些应用程序在何处以及如何存储密钥?
解决方法
您可以使用Andriod Keystore加密您的sqlCipher密码.
我之前遇到过同样的问题,其中sqlCipher用于保护数据,但密码本身却没有.这允许一个安全漏洞,其中一个简单的反编译将显示密码,因为它是字符串常量的形式.
我的解决方案是:
>首次启动应用程序时生成一个随机数. (您可以根据自己的需要更改此行为)
>使用Android Keystore加密此号码.
>数字的原始形式一旦加密就消失了.
>在Prefs中保存.
>现在,只要sqlCipher需要密码,它就会解密并使用它.
>由于Android Keystore在运行时提供密钥,并且密钥严格依赖于应用程序,因此很难破坏此数据库.
>虽然一切都可以破解,但这种方法会让攻击者更难从DB或DB密码中检索数据.
这是我制作的一个示例项目,它也有一个与您相同的sqlCipher用例.
Encryption Helper for Encrypting Passwords
请注意,在上面的讨论中,您用作加密密钥的术语将用作DB的密码/编号.