Cifrado y protección con contraseña en SQLite

Bilal Shahid 21 junio 2023
  1. ¿Qué es el cifrado?
  2. Cómo establecer una contraseña en SQLite
  3. Cómo cifrar una base de datos en SQLite
Cifrado y protección con contraseña en SQLite

Cuando se trata de grandes bases de datos con información confidencial, es bastante natural querer ocultarla bien. Si permanece en un sistema, normalmente bastará con una contraseña.

Sin embargo, es mejor cifrar su base de datos si se envía a través de redes no seguras.

¿Qué es el cifrado?

El cifrado, en pocas palabras, es el proceso de convertir sus datos en cadenas de datos ilegibles que no se pueden descifrar simplemente leyéndolos. Requiere una clave para cifrarlo y descifrarlo.

El descifrado devuelve los datos ilegibles a su forma original, mientras que el cifrado es lo contrario y los datos legibles se transforman en una forma ilegible.

Los datos se cifran en base a un algoritmo. Su complejidad puede variar, y algunos son más confiables que otros.

Por lo tanto, el tipo de cifrado que utilice debe ser lo suficientemente fiable como para evitar el descifrado sin una clave.

Cómo establecer una contraseña en SQLite

Para proteger su base de datos en SQLite, use el siguiente código antes de realizar cualquier otra operación para establecer una contraseña.

SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("any_password");
conn.open();

Puede acceder a su base de datos (en SQLite versión 3) la próxima vez usando lo siguiente:

conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=any_password;");
conn.Open();

También puede restablecer su contraseña con esto:

conn.ChangePassword("new_password");

Si agrega la cláusula String.Empty en lugar de la contraseña, puede eliminar la contraseña.

Cómo cifrar una base de datos en SQLite

Se pueden adoptar múltiples métodos para cifrar sus datos. Casi todos usan alguna extensión o software que es completamente seguro y puede cifrar sus datos con éxito.

Aquí hay algunas opciones confiables:

Extensión de cifrado SQLite (VER)

Este es un servicio de encriptación estándar específicamente para SQLite. Le permite leer y escribir en archivos cifrados y no cifrados en SQLite.

Además, incluso puede usar el comando ADJUNTAR para trabajar con dos o más archivos simultáneamente usando VER.

Encriptar el archivo es bastante simple en esta extensión. Puede hacerlo usando el código a continuación.

int sqlite3_key
(
   sqlite3 *db,
   const void *e_key,
   int key_size
);

Aquí, la primera línea representa la base de datos utilizada, la segunda se refiere a la clave utilizada para el descifrado y la última fila representa la cantidad de bytes utilizados para almacenar la clave.

También puedes cambiar la clave de tu base de datos usando el siguiente código:

int sqlite3_rekey
(
   sqlite *db,
   const void *e_key, int key_size
);

Aquí, la primera fila representa la base de datos y la segunda incluye la nueva clave y el tamaño total de la clave.

También puede utilizar sqlite3_rekey() para descifrar una base de datos cifrada previamente especificando una clave NULL.

Así es como SEE encripta los datos y metadatos de toda la base de datos. Sin embargo, es esencial tener en cuenta que esto actualmente no está disponible de forma gratuita.

wxSQLite

Este servicio de cifrado está abierto a todos. Puede considerarse un contenedor de C++ alrededor de la base de datos SQLite de dominio público.

Lo que es diferente de esto es que wxSQLite no intenta ocultar la base de datos subyacente. En cambio, es compatible con todas las funciones y las encripta todas individualmente en codificación UTF-8 con conversión automática entre cadenas wxStrings y UTF-8.

Para otras compilaciones ANSI, se utiliza el objeto de conversión de configuración regional actual (wxConvCurrent) para la conversión. Aún así, es importante tener en cuenta que pueden surgir problemas si se utilizan herramientas de administración externas para modificar la base de datos.

Este cifrado basado en claves le permite seleccionar su esquema de cifrado preferido en tiempo de ejecución.

SQLCipher

SQLCipher es una extensión de código abierto para SQLite. Proporciona servicios de encriptación seguros basados en sus requisitos.

Por ejemplo, ofrecen diferentes paquetes como “Community”, “Commercial” y “Enterprise”. Cada uno ha sido diseñado para proporcionar las funciones que necesitará sin pagar por funciones adicionales.

SQLCipher tiene un rendimiento excelente y ocupa poco espacio, por lo que es ideal para proteger bases de datos de aplicaciones integradas y es muy adecuado para el desarrollo móvil. Sus características incluyen lo siguiente:

  1. Solo hay un 5-15 % de sobrecarga de cifrado. Esto significa que proporciona un cifrado rápido.
  2. Toda la base de datos está encriptada.
  3. Las prácticas de seguridad incluyen el modo CBC y la derivación de claves.
  4. Ofrece criptografía a nivel de aplicación.
  5. La biblioteca criptográfica OpenSSL revisada por pares proporciona los algoritmos.
  6. Admite múltiples plataformas.

SQLiteCrypt

Este servicio utiliza soporte de cifrado AES 256, que es el mismo AES que SQLite, sin comprometer demasiado la velocidad. De hecho, al usuario le parecerá tan rápido como lo normal.

Estas son algunas de las características que proporciona.

  1. Es increíblemente rápido.
  2. Solo necesita reemplazar el tiempo de ejecución de SQLite y agregar 2 PRAGMA para usarlo.
  3. Descifra un bloque a la vez, por lo que los piratas informáticos tampoco pueden obtener nada del volcado de memoria.
  4. La configuración cero permite el cifrado con un proceso simple.

Las declaraciones pragma que utiliza se mencionan a continuación.

PRAGMA key = 'the passphrase'
PRAGMA lic = 'the license key'
PRAGMA rekey = 'new passphrase'

El primero es crear una base de datos cifrada, el segundo es identificar una copia legal del software SQLiteCrypt y el último es volver a escribir la base de datos con una nueva frase de contraseña.

Sqleet

Sqleet es un servicio de cifrado transparente basado en algoritmos avanzados para una seguridad óptima. Ofrece una robusta resistencia de canal lateral y un alto rendimiento de software.

La compilación es simple debido a la ausencia de dependencias para facilitar la compilación cruzada y el desarrollo multiplataforma.

Puede compilar un shell SQLite3 con soporte de encriptación sqleet de la siguiente manera:

  1. Unix - % gcc sqleet.c shell.c -o sqleet -lpthread -ldl
  2. Windows - % gcc sqleet.c shell.c -o sqleet

Sistema.Datos.SQLite

Esta es una biblioteca .NET que ofrece cifrado. Después de descargar el paquete correspondiente, extraiga SQLite.Interop.dll y cámbiele el nombre a sqlite3.dll.

Esto cifra con contraseñas de texto sin formato o claves de cifrado.

Rutinas de creación de funciones

También puede usar las rutinas de creación de funciones de SQLite.

$db_obj->sqliteCreateFunction('Encrypt', 'function_name', 2);
$db_obj->sqliteCreateFunction('Decrypt', 'function_name', 2);

Ahora, podrá encriptar fácilmente sus bases de datos y agregar contraseñas.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub