- Desde la versión 1.4 de DuckDB se agregó la función de cifrado de datos en reposo (Data-at-Rest Encryption), que permite proteger todo el archivo de base de datos con cifrado estándar basado en AES
- Los algoritmos compatibles son AES-GCM-256 y AES-CTR-256; entre ellos, GCM incluye una etiqueta de autenticación (tag) para verificar la integridad de los datos
- El cifrado se aplica a los archivos de base de datos, el WAL (Write-Ahead Log) y los archivos temporales, e incluye una estructura de caché segura para la administración de claves y la protección en memoria
- Se ofrecen dos implementaciones, OpenSSL y Mbed TLS; al usar OpenSSL, gracias a la aceleración por hardware, casi no hay pérdida de rendimiento
- Los archivos DuckDB cifrados logran al mismo tiempo seguridad y portabilidad, lo que permite distribuir datos de forma segura incluso en entornos de nube o CDN
Resumen del cifrado
- Desde DuckDB 1.4 es posible cifrar de forma transparente (Transparent Encryption) todo el archivo de base de datos
- Al guardar, se usa cifrado AES-GCM-256 o AES-CTR-256
- AES-GCM calcula una etiqueta para verificar la integridad, mientras que AES-CTR es más rápido pero no tiene función de autenticación
- AES es un algoritmo de cifrado simétrico, en el que se usa la misma clave para cifrar y descifrar
- Se usan IV (Initialization Vector) y nonce para garantizar que el mismo texto plano se convierta en textos cifrados distintos
- Aún no cumple por completo con los requisitos del estándar NIST
Estructura de implementación interna de DuckDB
- El encabezado principal del archivo de base de datos se mantiene en texto plano y almacena una bandera que indica si está cifrado y los metadatos de cifrado
- Los metadatos incluyen el identificador de la base de datos (salt), información del algoritmo de cifrado y un canary cifrado
- Mediante una función de derivación de claves (KDF), la clave ingresada por el usuario se convierte en una clave segura de 32 bytes
- La clave derivada se guarda en una caché segura y no se intercambia al disco
- La clave original se elimina de la memoria de inmediato
- Los bloques de datos se almacenan por defecto en unidades de 256 KB y, al cifrarse, se agregan nonce/IV y tag al encabezado del bloque, ampliándolo a 40 bytes
- La suma de verificación se almacena cifrada
Cifrado del WAL (Write-Ahead Log)
- El WAL es un archivo de registro para recuperación de transacciones, y en DuckDB se cifra por entrada
- A cada entrada se le agregan nonce y tag para protegerla con AES-GCM
- Una entrada cifrada del WAL se compone en este orden: longitud (texto plano) → nonce → checksum cifrado y datos → tag
- En las bases de datos donde se especifica una clave de cifrado, el cifrado del WAL se activa automáticamente
Cifrado de archivos temporales
- Los archivos temporales que se generan en operaciones grandes como ordenamientos, joins y funciones de ventana también se cifran automáticamente
- Se activa al conectar una base de datos cifrada o al configurar
SET temp_file_encryption = true
- DuckDB genera internamente una clave temporal; si hay un conflicto, no será posible descifrar
- Los archivos temporales tienen extensiones
.tmp o .block, e incluyen información de tamaño en el encabezado
- La suma de verificación se omite para reducir el costo de cálculo
Cómo usar el cifrado
Implementación y rendimiento
- Para minimizar las dependencias externas, DuckDB incluye dos implementaciones de cifrado: Mbed TLS y OpenSSL
- Mbed TLS tiene menor rendimiento porque la aceleración por hardware está desactivada y, debido al hallazgo de una vulnerabilidad en su generador de números aleatorios, la función de escritura fue deshabilitada (desde 1.4.1)
- OpenSSL usa aceleración por hardware y un generador de números aleatorios seguro, y cambia automáticamente al cargar la extensión
httpfs
- Resultados de pruebas de rendimiento:
- Consulta SUMMARIZE sin cifrado: 5.4 segundos
- Cifrado con Mbed TLS: 6.2 segundos
- Cifrado con OpenSSL: 5.4 segundos (sin pérdida de rendimiento)
- En las pruebas TPC-H Power/Throughput también hubo muy poca diferencia de rendimiento al usar cifrado
- Power@Size: 624,296 → 571,985
- Throughput@Size: 450,409 → 145,353 (ligera disminución cuando aumenta el I/O de disco)
Conclusión
- La función de cifrado de datos en reposo de DuckDB permite proteger de forma segura todo el archivo de base de datos
- Como también se cifran el WAL y los archivos temporales, se reduce el riesgo de filtración de datos incluso en entornos de nube
- Con una implementación basada en OpenSSL casi no hay pérdida de rendimiento, por lo que puede usarse de forma eficiente en entornos reales
- Los archivos DuckDB cifrados también son adecuados para la distribución externa, como mediante CDN, y mantienen funciones existentes como el almacenamiento de múltiples tablas
- El equipo de DuckDB planea mejorar la función en el futuro a partir de los comentarios de los usuarios
1 comentarios
Opiniones en Hacker News
La sensibilidad de AES-GCM a la reutilización del nonce es una parte complicada de implementar
La documentación muestra que son conscientes de ello, pero no compartieron cómo lo resuelven
En el encabezado se incluye un nonce de 16 bytes en vez de 12, y no queda claro qué bytes son aleatorios, lo que resulta confuso. Me pregunto si se me pasó algo
Me sigue sorprendiendo lo que logra el equipo de DuckDB
Antes hice una solución simple para cifrar archivos de DuckDB con OpenSSL, pero la primera consulta tardaba el doble y además usaba mucha memoria
En cambio, DuckDB aprovecha cifrado por páginas y la aceleración AES del CPU, así que el costo de lectura/escritura es casi nulo
Aprovecha la aceleración a nivel kernel y funciona de forma transparente para las aplicaciones de arriba
A menos que varias apps necesiten distintos ACL y claves, no hace falta que el cifrado esté dentro de la base de datos
Comparado con un cifrado simple de archivo completo, claro que se ve mejor, pero esto es una implementación de nivel básico
Nosotros mismos deberíamos aspirar a este nivel de calidad
Comparado con la E/S del almacenamiento, el costo del cifrado es casi gratis
Me pregunto si, aparte de MotherDuck, existe algún modelo que opere bien DuckDB en la nube para múltiples usuarios
Estoy buscando una arquitectura donde varios usuarios puedan acceder al mismo tiempo, como en una base de datos tradicional, y aun así aprovechar las ventajas de DuckDB
El rendimiento cambia bastante según dónde guardes el archivo
.duckdb(S3 vs EFS)Pero DuckLake parece una mejor opción multijugador
Nosotros usamos DuckLake en el producto y, para reducir la pérdida de rendimiento, guardamos las tablas analíticas en almacenamiento rápido como GCP Filestore
Incluso dentro de un mismo catálogo de DuckLake se pueden mezclar varios tipos de almacenamiento, lo que da flexibilidad
DuckDB me ha resultado más útil que las herramientas de IA que he usado hasta ahora
Me gustan los LLM, pero en eficiencia real de trabajo DuckDB me ayuda mucho más
Me da curiosidad cómo manejan la indexación de claves
Quisiera saber si durante la búsqueda localizan la clave ya cifrada o si van descifrando bloque por bloque
Se dice que la “extensión de cifrado de SQLite es un add-on de pago de 2000 dólares”, pero
SQLiteMultipleCiphers existe gratis desde hace mucho tiempo
Además, Turso Database trae cifrado por defecto
El proceso de enlazado parece complicado según el lenguaje
Es una solución desarrollada desde 2009 y funciona de forma estable