Cifrado de la Base de Datos de SQLite

LiteSync viene con cifrado de las bases de datos de SQLite también conmo la comunicación entre los nodos

Los métodos de escritura secretos disponibles son ChaCha, el cual es rápido que AES en pequeños dispositivos, y XRC4, una versión extendida de RC4 incluso más rapida que ChaCha.

Para abrir una base de datos encriptada usamos los parámetros cipher y key o hexkey URI. Ejemplo:

"file:/path/to/file.db?cipher=...&key=..."

O

"file:/path/to/file.db?cipher=...&hexkey=..."


EL MÉTODO DE ESCRITURA SECRETO

El argumento del método de escritura secreto puede ser colocado a uno de estos valores:

xrc4 - más rápido
chacha8 - rápido
chacha12 - medio
chacha20 - más fuerte



LA LLAVE

Usando XRC4 la llave puede ser hasta 256 bytes. Ejemplos:

"file:data.db?cipher=xrc4&key=testing"

Usando ChaCha la llave dede ser 32 bytes long. Ejemplos:

"file:data.db?cipher=chacha20&key=ThisIsAReallyLongKeyWith32Bytess"

La llave también puede estar en formato hex, usando el parámetro hexkey:

"file:data.db?cipher=...&hexkey=11223344556677889900AABBCCDDEEFF..."


CREANDO UNA BASE DE DATOS ENCRIPTADA

Abre la base de datos con un URI como los anteriores y luego crea las tablas y llénalas.



CONVERTIR UNA BASE DE DATOS EXISTENTE

Actualmente no es posible realizar una conversión directa de una base de datos existente. Debemos crear una base de datos encriptada usando el escudo de SQLite y luego copiar los datos de la base de datos simple a ahí.

Puede ser realizado en solo 1 paso:

sqlite3 plain.db .dump | sqlite3 "file:encrypted.db?cipher=...&key=..."

O en 2 pasos si quieres inspeccionar los comandos de SQL generados:

sqlite3 plain.db .dump > out.sql

sqlite3 "file:encrypted.db?cipher=...&key=..." < out.sql

Si tu quieres usar un tamaño de página diferente al predeterminado, abra el archivo out.sql generado y añade la línea pragma en la parte superior:

PRAGMA page_size=...;

Atención: Este archivo de la base de datos encriptado debe ser usado solo en el nodo primario. Los nodos secundarios descargarán este archivo desde el nodo primario cuando la conección es establecida.



ENCABEZADO DE LA BASE DE DATOS

Los primeros 100 bytes de la base de datos de SQLite forman el encabezado. La mayor parte son datos fijos.

En encripción si tenemos datos simples conocidos esto ayuda a un atacante a tratar de descubrir la llave de encripción.

Por esta razón el encabezado de la base de datos no está encriptado por defecto, pero tienes 3 opciones en total:


1. No cifres el encabezado de db

Este es el comportamiento por defecto


2. No cifres el encabezado de db y usa una cadena de encabezado personalizada

Los primeros 16 bytes del encabezado forman la cadena de encabezado. La cadena de encabezado por defecto es "SQLite format 3" (con un terminador nulo).

Si por alguna razón no quieres aclarar que el archivo es una base de datos de SQLite puedes cambiar esta cadena.

Para activar el uso de un encabezado personalizado compila LiteSync con:

CODEC_USE_CUSTOM_HEADER

CODEC_CUSTOM_HEADER="ExampleNewHeader"

La cadena de encabezado personalizada debe ser 15 o 16 bytes máximo. Si decides colocar 15 bytes, el último dígito debe ser un terminador nulo.


3. Cifra el encabezado de db pero no cifres los bytes 16-23 desde ahí

Estos bytes son necesarios por SQLite para ser descifrados.

Para cifrar el encabezado de la base de datos compila LiteSync con:

CODEC_ENCRYPT_DB_HEADER



DISEÑO INTERNO

Cada página es cifrada y descifrada a demanda, y cada página tiene su propio vector de inicialización (mientras tanto). Cada momento una página es guardada, un nuevo IV es usado y luego toda los datos de la página encriptada serán diferentes que antes.

Las Páginas WAL también son cifradas.

La comunicación entre los nodos usan el mismo método de escritura secreto y llave seleccionada para la base de datos. Cada mensaje usa un vector de inicialización, entonces los mismos datos simples son enviados como una secuencia de cifrado diferente.