我正在使用适用于 Android 的 SQLCipher,并试图确定测试用户提供的密码是否有效的正确方法。
我的第一个倾向是尝试使用给定密码打开数据库,使用 SQLCipher 实现SQLiteOpenHelper.getReadableDatabase(password)
,然后捕获SQLiteException
弹出的内容。
这确实有效,但问题是因为 Android API 实际上包装了底层 C 调用,它为您做了很多工作 - 具体来说,当您使用 Android API 打开数据库时,它会打开数据库,运行本机C 级sqlite3_key
方法(使用提供的密码),然后尝试在数据库上设置区域设置,无论提供的密码是否正确。
此时Android库尝试设置locale,底层数据库抛出“加密还是不是数据库” SQLiteException
,被捕获并重新抛出;但在此之前,一个不相关的错误被写入日志,本质上是说无法设置区域设置并且数据库正在关闭(包含堆栈跟踪)。因为这是由Android库专门编写的,所以我无法抑制它,在日志中留下一个与我原来的问题无关的丑陋错误,这只是我输入了错误的密码。
因为 Android 库不公开 C 级调用,所以我不能只使用 SQLCipher API 文档中关于Testing the Key描述的方法,因为我无权直接打开数据库。
我倾向于使用SQLiteDatabaseHook
,但据我所知,这排除了我使用SQLiteOpenHelper
,它似乎没有提供设置挂钩的方法。
还有其他人知道测试输入密码是否通过 SQLCipher Android API 正确解密 SQLCipher 数据库的更好方法吗?我完全希望调用一个方法并检查是否引发了异常 - 我不希望该操作尝试在数据库上执行无关处理(如设置区域设置)并将一个完全无法抑制的错误写入我的日志。