gpt4 book ai didi

android - 是否有正确的方法来测试用户提供的 SQLCipher 密码在 Android 上是否有效?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:16:39 24 4
gpt4 key购买 nike

我正在使用 SQLCipher for Android并且正在尝试确定测试用户提供的密码是否有效的正确方法。

我的第一个想法是尝试使用给定的密码打开数据库,使用 SQLiteOpenHelper.getReadableDatabase(password) 的 SQLCipher 实现,然后捕获 SQLiteException弹出。

这确实有效,但问题是因为 Android API 实际上包装了底层 C 调用,它为您做了很多工作 - 具体来说,当您使用 Android API 打开数据库时,它会打开数据库,运行 native C 级 sqlite3_key 方法(使用提供的密码),然后尝试在数据库上设置语言环境,无论提供的密码是否正确。

此时,Android库尝试设置语言环境,底层数据库抛出“是否加密数据库”SQLiteException,被捕获并重新抛出;但在此之前,一个不相关的错误被写入日志,本质上是说无法设置语言环境并且数据库正在关闭(包含堆栈跟踪)。因为这是专门由 Android 库编写的,所以我无法压制它,在日志中留下了一个丑陋的错误,实际上与我原来的问题无关,这只是我输入了错误的密码。

因为 Android 库不公开 C 级调用,所以我不能只使用 SQLCipher API 文档中关于 Testing the Key 的方法。 ,因为我无权直接打开数据库。

我倾向于使用 SQLiteDatabaseHook,但据我所知,这排除了我对 SQLiteOpenHelper 的使用,它似乎没有提供一种方法来设置钩子(Hook)。

有没有其他人知道任何更好的方法来测试输入密码是否通过 SQLCipher Android API 正确解密 SQLCipher 数据库?我完全希望调用一个方法并检查是否抛出异常 - 我不希望操作尝试在数据库上执行无关的处理(如设置区域设置)并在我的日志中写入一个完全无法抑制的错误。

最佳答案

我没有更好的方法来测试它。我只是想另外提供一些代码,这样当其他人查找时,他们可能会找到一些有用的代码 fragment 。至少当我发现这个问题时,我很想看到一些代码如何进行检查:)

我在android中的做法是这样的:

    // Simply get an instance of SQLiteOpenHelper.
dbHelperObj = myDatabase.getInstance(this, str_username, version);

// Now we try to open the database with the password from the user.
try {
dbObj = dbHelperObj.getReadableDatabase(str_password);

// The only possible error now must be a wrong password.
} catch (Exception e) {
dbHelperObj.close();

// Do stuff to tell the user he provided a wrong password.
}

关于android - 是否有正确的方法来测试用户提供的 SQLCipher 密码在 Android 上是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16553169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com