Cifrado del lado del servidor
El cifrado del lado del servidor proporciona una capa adicional de protección de datos. Todos los datos se cifran en el servidor antes de escribirse en la base de datos, independientemente del estado del cifrado del lado del cliente.
Descripción general
Propósito
| Escenario | Protección |
|---|---|
| Filtración de la base de datos | Datos cifrados con la clave del servidor |
| Copias de seguridad | Las copias de seguridad contienen solo texto cifrado |
| Acceso físico al servidor | Los datos no son legibles sin la clave |
| CSE deshabilitado | El cifrado del servidor siempre funciona |
Cómo funciona
Data from client
↓
[Server encryption AES-256-CFB]
↓
Database (ciphertext)
Algoritmo de cifrado
Parámetros
| Parámetro | Valor |
|---|---|
| Algoritmo | AES-256-CFB |
| Longitud de clave | 256 bits |
| Modo | CFB (Cipher Feedback) |
| IV | 128 bits, aleatorio por cifrado |
| Biblioteca | OpenSSL (vía PHP) |
Modo CFB
Características del modo CFB (Cipher Feedback):
- Convierte el cifrado por bloques en cifrado de flujo
- No requiere relleno
- Cada bloque depende del anterior
- El IV debe ser único para cada cifrado
Estructura de datos cifrados
[IV (128 bits)] + [Ciphertext]
El IV se almacena en texto plano junto con el texto cifrado y se utiliza para el descifrado.
Clave de cifrado del servidor
Generación de la clave
La clave se genera una vez durante la instalación del sistema:
| Parámetro | Valor |
|---|---|
| Tamaño | 256 bits |
| Fuente | Generador criptográficamente seguro |
| Entropía | 256 bits |
| Formato de almacenamiento | base64:{base64_encoded_key} |
Almacenamiento de la clave
La clave se puede almacenar de dos formas:
Método 1: En archivo (predeterminado)
| Parámetro | Valor |
|---|---|
| Ruta predeterminada | {PROJECT_DIR}/init/encryption_key |
| Ruta alternativa | Variable de entorno ENCRYPTION_KEY_PATH |
| Formato | base64:{base64_encoded_key} |
Método 2: En variable de entorno
La clave se puede pasar directamente mediante una variable de entorno, sin necesidad de archivo.
Configuración de permisos de acceso
Al almacenar la clave en un archivo, es obligatorio configurar los permisos de acceso:
# Owner — application user (e.g., www-data)
chown www-data:www-data /path/to/encryption_key
# Read-only for owner
chmod 400 /path/to/encryption_key
Si su organización tiene políticas de seguridad estrictas o requisitos regulatorios para el almacenamiento de claves criptográficas (HSM, almacenes de secretos externos, soluciones certificadas), contacte con el soporte técnico de Passwork para analizar las opciones de integración.
Verificación de integridad de la clave
La integridad de la clave se verifica al iniciar la aplicación:
- Cargar la clave desde el archivo
- Calcular el hash SHA-512 de la clave
- Comparar con el hash almacenado en la base de datos
- En caso de discrepancia — error de inicio
Esto previene el uso de una clave incorrecta y la corrupción de datos.
Qué se cifra en el servidor
La clave del servidor cifra los siguientes datos:
- Datos de registros (contraseñas, campos personalizados, archivos adjuntos)
- Claves de bóveda
- Claves de registro
- Datos de enlaces externos
- Contraseñas de integración LDAP
- Contraseñas del servidor SMTP
El cifrado se realiza automáticamente antes de guardar en la base de datos, y el descifrado al leer.
Configuración
Variables de entorno
| Variable | Descripción | Valor predeterminado |
|---|---|---|
ENCRYPTION_KEY_PATH | Ruta al archivo de la clave | %init_dir%/encryption_key |
ENCRYPTION_CIPHER | Algoritmo de cifrado | AES-256-CFB |
Configuración del cifrado
Algoritmos compatibles
El sistema admite cualquier algoritmo de cifrado disponible en OpenSSL en el servidor. Esto permite elegir un algoritmo según los requisitos de su organización o normativa.
Ejemplos de algoritmos compatibles:
| Tipo | Algoritmos |
|---|---|
| AES (256 bits) | AES-256-CFB (predeterminado), AES-256-GCM, AES-256-CBC, AES-256-CTR |
| AES (128 bits) | AES-128-GCM, AES-128-CBC, AES-128-CTR |
| ChaCha20 | ChaCha20-Poly1305 |
| Estándares nacionales | Camellia, ARIA, GOST (si lo admite OpenSSL) |
La lista completa de algoritmos disponibles depende de la versión de OpenSSL instalada en el servidor.
Visualización de algoritmos disponibles
Para ver todos los algoritmos disponibles en el servidor:
php bin/console app:cipher-methods:list
El comando muestra la lista de todos los métodos de cifrado compatibles y sus alias de OpenSSL.
Cambio de algoritmo
Método 1: Mediante archivo de configuración
Cree o edite init/config.env:
ENCRYPTION_CIPHER=AES-256-GCM
Método 2: Mediante variable de entorno
export ENCRYPTION_CIPHER="AES-256-GCM"
- El cambio de algoritmo requiere recifrar todos los datos (similar a la rotación de claves)
- Cree una copia de seguridad antes del cambio
- Planifique una ventana de mantenimiento para bases de datos grandes
Validación del algoritmo
El sistema valida la corrección del algoritmo en el primer cifrado. Si se especifica un algoritmo no compatible, la operación falla con un error.
Para verificar la disponibilidad del algoritmo:
// Check algorithm support
in_array('AES-256-GCM', openssl_get_cipher_methods())
Interacción con el cifrado del lado del cliente
Modelo de dos niveles
Flujo de datos con CSE habilitado:
- El usuario introduce la contraseña
- El cliente (navegador) cifra los datos con la clave de registro (AES-256-CBC) — Nivel 1 (CSE)
- El servidor recibe datos ya cifrados
- El servidor cifra con la clave del servidor (OpenSSL AES-256-CFB) — Nivel 2 (Lado del servidor)
- La base de datos almacena un doble texto cifrado
Con CSE deshabilitado:
- Los datos llegan en texto plano
- Solo se aplica el cifrado del servidor
- La base de datos almacena un nivel de cifrado
Garantías de seguridad
| Escenario | CSE habilitado | CSE deshabilitado |
|---|---|---|
| Filtración de la base de datos | Dos niveles de protección | Cifrado del servidor |
| Compromiso del servidor | CSE protege los datos | ⚠️ Datos accesibles |
| Administrador de la base de datos | No puede leer | Ve texto cifrado |