Siempre que comenzamos a hacer una aplicación, bien sea móvil o escritorio, una de las cosas a tener en cuenta es almacenar información en local para evitar llamadas al backend para solicitar datos que ya deberíamos tener almacenados. Esto tiene especial repercusión en las aplicaciones móviles, ya que puede que tengamos que trabajar con datos en local o que simplemente estemos sin conexión a internet en ese momento.
En este artículo me voy a centrar en la parte móvil de MAUI, así que veremos un caso de uso sólo para Android e iOS. Sin embargo, al estar utilizando .NET 6, esto sirve para cualquier entorno que puedas desplegar con esta versión de .NET, así que gran ventaja de utilizar esta versión de SQLite.
Creo que no hay discusión acerca del reinado de SQLite para almacenar datos en local en nuestras aplicaciones móviles y claro, con el cambio que ha supuesto el paso de Xamarin a MAUI y el uso de .NET 6 ha hecho que mi librería favorita, sqlite-net de Frank A. Krueger, no se haya actualizado aun y me he decantado por utilizar directamente la implementación de Microsoft, pero con una salvedad, quería utilizar una base de datos encriptada y ha sido una aventura de muchas horas hasta hacerlo funcionar como quería.
Vamos al lío. Lo primero que necesitamos es instalar estos Nugets, Microsoft.Data.Sqlite.Core y SQLitePCLRaw.bundle_e_sqlcipher.
Por defecto, si seguimos las instrucciones que nos ofrece Microsoft en su documentacion, podemos crear la base de datos con el Password sin problemas, pero cuando intentemos conectarnos de nuevo a la base de datos nos encontraremos con un bonito error: ´SQLite error 26: file is not a database´.
Para evitar este problema tenemos que hacer uso de SQLitePCLRaw.bundle_e_sqlcipher. Es absolutamente contraintuitivo y me ha costado algunas horas de investigación, pero al fin lo tengo funcionando.
Te describo los pasos que he seguido:
- Crea una base de datos sin Password, como harías normalmente.
- Conéctate a la base de datos.
- Ejectutar commando: ¨ATTACH DATABASE ‘targetDatabaseName.db’ AS targetDatabaseName KEY ‘_databasePassword’; SELECT sqlcipher_export(‘targetDatabaseName’); DETACH DATABASE targetDatabaseName;¨
- Borra la base de datos original
- Conéctate a la base de datos encriptada
- Crea tus tablas.
Te dejo enlace a un gist para que puedas copiar el código rápidamente.
Listo, con esto ya tenemos acceso a nuestra base de datos cifrada y lista para ejecutar nuestras consultas. A partir de aquí, elige el modo que mejor se adapte a tus necesidades. En mi caso, estoy utilizando Dapper para mantener mis consultas SQL en mi repositorio y poder seguir la evolución en mi control de versiones.
Espero que te sirva para proteger tus bases de datos.
Saludos!