如何存储SQLCipher中用于android的密钥

我正在使用SQLCipher for Android。 我已经完成了加载libs所需的所有必要的东西,如http://sqlcipher.net/sqlcipher-for-android/中所述

我发现你设置密码即密钥:

SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null); 

那么你的密码如何从黑客那里获得安全保障? 因为它可以从java文件中访问。 ?

有没有正确的方法可以存储密码?

谢谢,Nibs

那么你的密码如何从黑客那里获得安全保障?

不是。 但是,对密码进行硬编码可以进行简单的演示。

有没有正确的方法可以存储密码?

用户应通过UI为用户的数据库提供密码。 然后,用户将密码短语存储在用户的头部,或者您可能将用户头部的内容与其他内容结合起来进行轻量级双因素身份validation(例如,配对蓝牙可穿戴设备的MAC地址)。

我想建议以下方法:

  • 第一次创建数据库时,您必须创建一个随机密码。
  • 您将此密码存储在密钥库中。
  • 每当您打开应用程序时,您都会从密钥库中读取密码并使用它来连接数据库。

那么密钥库访问如何工作? 请参阅博客条目1和博客条目2以及相应的github存储库 。 该解决方案适用于Android版本2.1至4.3。

重要提示:

  1. 该解决方案仅适用于私有API访问,因此将来可能会中断。
  2. 如果用户删除了锁定屏幕密码,则需要使用屏幕锁定密码来存储密钥并擦除所有密钥。

被忽视的事实是,SQLCipher提供的演示纯粹是为了演示。 开发人员的想象力可以克服显而易见的问题。 稍微不那么明显的是,您不会将密钥存储在私有本地variables中,因为对类文件执行字符串搜索可能会泄露您的密钥,从而减少成功暴力攻击所需的字典。 在hex编辑器中打开classes.dex并尝试它。

这不是您应该关注的.java文件,因为只有您的开发人员应该在那里。 这是.class文件。 下一级别的努力是混淆的一些努力,但这实际上只限制了不耐烦。

看一下这个讨论https://groups.google.com/forum/#!topic/sqlcipher/OkE0rUwXEb8