¿Existe una manera correcta de comprobar si una contraseña SQLCipher proporcionada por el usuario es válida en Android?

Estoy utilizando SQLCipher para Android y estoy tratando de determinar la forma correcta de probar si una contraseña proporcionada por el usuario es válida.

Mi primera inclinación fue simplemente intentar abrir la base de datos con la contraseña dada, utilizando la implementación SQLiteOpenHelper.getReadableDatabase(password) de SQLiteOpenHelper.getReadableDatabase(password) y, a continuación, captura la SQLiteException que aparece.

Esto funciona, pero el problema es que debido a que la API de Android realmente envuelve las llamadas de C subyacentes, hace mucho del trabajo para usted, específicamente cuando abre una base de datos utilizando la API de Android, abre la base de datos, C- sqlite3_key método (con la contraseña proporcionada), a continuación, intenta establecer la configuración regional en la base de datos, independientemente de si la contraseña proporcionada era correcta o no.

En este punto, la biblioteca de Android intenta establecer la configuración regional y la base de datos subyacente arroja la " SQLiteException " cifrada o no de una base de datos, que se captura y vuelve a activar; Pero antes de que sea, un error no relacionado se escribe en los registros, esencialmente diciendo que la configuración regional no se puede establecer y la base de datos se está cerrando (con un seguimiento de pila incluido). Debido a que esto está escrito específicamente por la librería de Android, no puedo suprimirlo, dejando un error feo en los registros que en realidad no están relacionados con mi problema original, que fue simplemente que pasé en la contraseña incorrecta.

Debido a que la biblioteca de Android no expone las llamadas de nivel C, no puedo utilizar el método descrito en la documentación de API de SQLCipher con respecto a la prueba de la clave , porque no tengo acceso para abrir directamente la base de datos.

Me inclino hacia el uso de SQLiteDatabaseHook , pero como mejor puedo decir, que excluye mi uso de SQLiteOpenHelper , que no parece proporcionar una forma de configurar un gancho.

¿Alguien más sabe alguna mejor manera de probar si una contraseña de entrada descifra correctamente una base de datos SQLCipher a través de la SQLCipher Android API? Esperaría completamente llamar a un método y comprobar para una excepción que es lanzada – lo que no quiero es para que la operación intente realizar el proceso extraño (como el ajuste del locale) en la base de datos y escriba un error totalmente insuppressible a mis registros.

SQLCipher para Android no sabe que la contraseña que ha proporcionado es inválida después de una llamada a sqlite3_key , ya que la clave de la base de datos no se utiliza hasta que se emite un comando SQL contra la base de datos después de sqlite3_key , como el setLocale(...) Usted referencia arriba. El problema es que proporcionar una clave no válida puede ser sólo uno de los posibles otros escenarios que podrían ser el problema en el momento en que se ejecuta la primera instrucción SQL. Un archivo de datos dañado, una comprobación HMAC fallida o abrir un archivo que no sea de base de datos podría producir el mismo mensaje de error. Para una descripción detallada de esto, revise este hilo . Sería mejor detectar la excepción al intentar abrir la base de datos y manejarla en consecuencia dentro de la aplicación cliente.

No tengo una mejor manera de probarlo. Sólo quiero proporcionar algún código además, así que cuando otras personas busquen esto, pueden encontrar algunos fragmentos de código útiles. Por lo menos cuando encontré esta pregunta, me hubiera encantado ver algún código cómo hacer para el chequeo 🙂

La forma en que lo hago en Android es esta:

  // 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 Studio (Beta v0.8.6) e integración con SQLCipher (v3.1.0)
  • Android SQCipher ¿Necesito cerrar la base de datos?
  • Android Proguard SqlCipher NoClassDefFoundError
  • Cómo almacenar la clave utilizada en SQLCipher para android
  • CREATE TABLE android_metadata falló al volver a abrir sqlcipher DB
  • Cifrar la base de datos sqlite Android:
  • ¿Cómo empezar con SQLCipher para Android?
  • Integración de SQLCIPHER en el proyecto de Android Studio
  • SQL Cursor lanza fuera de la memoria mientras llama a getString
  • Sqlcipher 'open' performance con cordova y Cordova-SQLitePlugin
  • Java.lang.UnsatisfiedLinkError: No se pudo cargar stlport_shared: findLibrary devuelto null (tess-two)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.