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

时间:2014-02-24 12:00:08

标签: android sqlite sqlcipher

我正在使用SQLCipher for Android。我已经完成了所需的所有必要的事情 加载http://sqlcipher.net/sqlcipher-for-android/

中提到的库

我发现您设置了密码,即密钥:

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

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

我可以存储密码的正确方法吗?

谢谢, 碎粒

3 个答案:

答案 0 :(得分:3)

  

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

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

  

我可以存储密码的正确方法吗?

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

答案 1 :(得分:2)

我想建议以下方法:

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

那么密钥库访问如何工作?请参阅blog entry 1blog entry 2以及相应的github repository。该解决方案适用于Android版本2.1至4.3。

重要提示:

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

答案 2 :(得分:1)

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

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

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