Spanish [B4A] Tutorial cifrado y descifrado de BBDD Sqlite

joseluis

Active Member
Licensed User
Longtime User
[Esto es una traducción del post original.]


El motor nativo de SQLite incluido en el SO no soporta cifrado. SQLCipher es un proyecto de código abierto que extiende SQLite y añade cifrado completo de la base de datos.

El objeto SQLCipher en B4A es un subtipo especial de objeto de SQL Server. Casi no hay necesidad de modificar ningún código a fin de pasar de SQL normal a SQLCipher.

SQLCipher depende de varios recursos nativos que están empaquetados en un archivo llamado sqlitecipher_native.zip. El tamaño del archivo es de 3MB.
La primera vez que el programa se ejecuta después de la instalación es necesario descomprimir el archivo descargado y copiar los recursos a la carpeta interna.

En los dispositivos más lentos la acción de copia puede llevar mucho tiempo.
Se recomienda inicializar el objeto con un código como éste:
B4X:
ProgressDialogShow("Inicializando base de datos...")
SQL1.Initialize(File.DirRootExternal, "1.db", True, DB_PASSWORD, File.DirRootExternal)
ProgressDialogHide
Solo es lento la primera vez que la aplicación se ejecuta después de la instalación.

Preferentemente es mejor utilizar un dispositivo real en el desarrollo ya que el emulador es demasiado lento para manejar los recursos nativos.

La única diferencia entre la API SQL y la API SQLCipher es el método Initialize.
SQLCipher.Initialize espera dos valores adicionales: Password y NativeLibsFolder.

Password es la contraseña de la base de datos. Puedes pasarle una cadena de texto vacía si no hay contraseña. Ten en cuenta que no es posible cambiar la contraseña (o quitarla) de una una base de datos existente.

NativeLibsFolder es la carpeta donde se encuentra sqlitecipher_native.zip. Normalmente ese fichero se añadiría a la pestaña Files del editor y a la variable se le daría el valor de File.DirAssets. Otra opción es que, durante el desarrollo, a fin de hacer más rápido el proceso de instalación, lo copies manualmente a la tarjeta de almacenamiento y a la variable le des el valor de File.DirRootExternal (asegúrate en ese caso de quitarlo de la pestaña y borrarlo de la carpeta Files).

Cambios en el código requeridos para convertir de SQL a SQLCipher
- Declarar el objecto SQL como SQLCipher.
- Cambiar el código de inicialización a:
B4X:
ProgressDialogShow("Inicializando base de datos...")
SQL1.Initialize(File.DirRootExternal, "1.db", True, DB_PASSWORD, File.DirAssets)
ProgressDialogHide

Ten en cuenta que no hay necesidad de cambiar nada en el módulo DBUtils

La librería puede ser descargada de aquí:
http://www.basic4ppc.com/android/files/SQLCipher.zip

Instrucciones de instalación:
- Descomprimir el archivo.
- Copiar todos los archivos de InternalLibrariesFolder a la carpeta de librerías internas.
- Añade sqlcipher_native.zip de la carpeta NativeResources a tu proyecto como se ha descrito previamente.
- Deberías hacer referencia tanto a SQL como a SQLCipher en tu proyecto.
 
Last edited:

Ecoleo

Member
Licensed User
Longtime User
Gracias por la traducción , ahora ya me parece más "accesible" a mis conocimientos y probaré a utilizarla.
Cuando vi el post en inglés, pense "qué interesante.., pero, uff, que pereza.. , ".
Deberiamos volver a sacar el tema de "traducir el manual", ya se que tú lo has intentado, pero creo que es muy necesario, sobre todo para los novatos como yo. De momento salvo en este foro, no hay ningún otro sitio ni publicación que nos sirva de ayuda en el aprendizaje del basic4android.
Saludos:sign0098:
 

joseluis

Active Member
Licensed User
Longtime User
Ya ves, yo pensaba que no se podían crear BBDD cifradas en B4A, por haberlo leído de manos de Erel hace un tiempo. Buscando por internet encontré esa librería, y mi intención era abrir un hilo para pedir que alguien hiciera posible acceder a ella desde B4A, y me encuentro con esto. :D

En cuanto a lo del manual... Sí, estaría bien, pero yo no puedo dedicarle tiempo de momento. Iba a decir que si alguien monta un wiki... podría traducir de vez en cuando algo... Vaya! Se me ocurre que a lo mejor tenemos un wiki. El propio de B4A!, aunque no sé si soporta imágenes... Voy preguntarle a Erel si nos deja hacer el tutorial en español en el wiki del sitio :)
 

Ecoleo

Member
Licensed User
Longtime User
Lo del wiki es muy buena idea, porque además nos permitiria ir añadiendo ejemplos , imagenes, trozos de codigo, etc.. Además del consabido manual. Al menos en mi caso , cuando necesito "ver." algún código que me ilumine.. me paso mucho tiempo buscando en este foro y casí siempre me "repito" los mismos posts, y cuando busco entre "mis favoritos.." , casi peor, tengo tantos links, que casi acabo antes buscando en el buscador del foro. Menos mal que vosotros me ayudáis raaaaaaaapidamente..:)
 

joseluis

Active Member
Licensed User
Longtime User
Vale, pero vamos a mantener este hilo on-topic. :D Voy a poner un post con lo que me ha dicho Erel en el de la traducción de la guía.
 

psdos

Active Member
Licensed User
Longtime User
Necesito una ayudita con esta nueva libreria. He añadido a mi proyecto el fichero "sqlcipher_native.zip", tal cual, no lo he descomprimido y añadido su contenido (supongo que es asi como se ha de añadir).

Luego he inicializado mi base de datos asi

B4X:
ProgressDialogShow("INICIANDO BASE DE DATOS, ESPERE POR FAVOR")
   
   If File.Exists(File.DirDefaultExternal, "bustagenadb.db") = False Then
   
      File.Copy(File.DirAssets, "bustagenadb.db", File.DirDefaultExternal, "bustagenadb.db")
      File.Copy(File.DirAssets, "sqlcipher_native.zip", File.DirDefaultExternal, "sqlcipher_native.zip")
   
   End If
   
   If FirstTime Then
   
      'xSQL.Initialize(File.DirDefaultExternal, "bustagenadb.db", True)
      
      xSQL.Initialize(File.DirDefaultExternal, "bustagenadb.db", True, DB_PASSWORD, File.DirDefaultExternal)
      
   
   End If
   
   ProgressDialogHide
   
   
   xCursor = xSQL.ExecQuery("SELECT * FROM Fichas")
   
   For I = 0 To xCursor.RowCount - 1
      DoEvents
      xCursor.Position = I
      ElementoList.Add(xCursor.GetString("Elemento"))
      ImagenList.Add(xCursor.GetBlob("Imagen"))
      DescripcionList.Add(xCursor.GetString("Descripcion"))
   Next

pues el programa se me queda parado en

xCursor = xSQL.ExecQuery("SELECT * FROM Fichas")

A la base de datos le puse contraseña logicamente para probar con esta nueva libreria.

Alguna idea de por que no me funciona?

Muchas gracias.



PD: Ya me contesto yo mismo tras leer un mensaje de Erel "This library does allow you to create newly encrypted databases. The Android version of SQLCipher currently doesn't support encrypting existing databases.", vamos que no soporta mas que la creacion desde cero de la base de datos con contraseña. No puede gestionarlas si le añadimos la contraseña antes.
 
Last edited:

jota1010

Member
Licensed User
Longtime User
Erel, could upload an example of working sqlchiper actually took almost two days and I could not work, I always generates the same error.
net.sqlcipher.database.SQLiteException: file is encrypted or is not a database
 
Top