Есть ли правильный способ проверить, действительно ли предоставленный пользователем пароль SQLCipher действителен на Android?

Я использую SQLCipher для Android и пытаюсь определить правильный способ проверить, действительно ли предоставлен пароль пользователя.

Моей первой целью было просто попытаться открыть базу данных с данным паролем, используя SQLCipher-реализацию SQLiteOpenHelper.getReadableDatabase(password) , а затем поймать SQLiteException который появляется.

Это действительно работает, но проблема в том, что, поскольку API Android фактически обертывает базовые вызовы C, он выполняет большую часть работы для вас – в частности, когда вы открываете базу данных с помощью API Android, она открывает базу данных, запускает собственный C-level sqlite3_key (с предоставленным паролем), затем пытается установить локаль в базе данных, правильно ли предоставлен пароль.

На данный момент в Android-библиотеке делается попытка установить локаль, а базовая база данных SQLiteException «зашифрованную или не базу данных» SQLiteException , которая поймана и обновлена; Но перед этим в журналы записывается несвязанная ошибка, по существу говоря, что локаль не может быть задана и база данных закрыта (с включенной трассировкой стека). Поскольку это специально написано в библиотеке Android, я не могу его подавить, оставив уродливую ошибку в журналах, которые фактически не связаны с моей исходной проблемой, а это просто то, что я передал неправильный пароль.

Поскольку в библиотеке Android не отображаются вызовы уровня C, я не могу просто использовать метод, описанный в документации API SQLCipher относительно тестирования ключа , потому что у меня нет доступа к прямому открытию базы данных.

Я склоняюсь к использованию SQLiteDatabaseHook , но, насколько я могу судить, это исключает мое использование SQLiteOpenHelper , который, SQLiteOpenHelper , не дает возможности настроить крючок.

Кто-нибудь еще знает лучший способ проверить, правильно ли расшифровывает входную фразу для шифрования базы данных SQLCipher через API Android SQL Encryption? Я бы полностью ожидал вызова метода и проверки того, что выбрано исключение – я не хочу, чтобы операция пыталась выполнить и выполнить постороннюю обработку (например, set locale) в базе данных и записать полностью непередаваемую ошибку в мои журналы.

SQLCipher для Android не знает, что пароль, который вы предоставили, недействителен после вызова sqlite3_key , поскольку ключ базы данных не используется до тех пор, пока команда SQL не будет выдана против базы данных, следующей за sqlite3_key , например метод setLocale(...) Вы ссылаетесь выше. Проблема заключается в том, что предоставление недействительного ключа может быть только одним из возможных других сценариев, которые могут быть проблемой в момент, когда выполняется первый оператор SQL. Коррумпированный файл данных, сбой проверки HMAC или открытие файла без базы данных могут привести к тому же сообщению об ошибке. Для подробного описания этого, пожалуйста, просмотрите эту тему . Лучше всего поймать исключение при попытке открыть базу данных и соответственно обработать ее в клиентском приложении.

У меня нет лучшего способа проверить это. Я просто хочу предоставить некоторый код в дополнение, поэтому, когда другие люди смотрят это, они могут найти полезные фрагменты кода. По крайней мере, когда я нашел этот вопрос, мне бы очень хотелось увидеть какой-то код, как сделать проверку:

То, как я делаю это в 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. } 
Intereting Posts