Objetivo
Quiero almacenar datos cifrados en una base de datos.
Restricciones
- El cifrado a nivel de la aplicación (cifrar antes de enviar a la base de datos) no es una opción razonable para mi caso de uso.
- Los proveedores de DB que estoy considerando no me permiten crear múltiples usuarios / administrar permisos al precio que pagaré. Esto significa que separar los permisos para los registros frente a las lecturas y escrituras no es una opción.
Opciones
- Permitir que MySQL maneje el cifrado AES (a través de
aes_encrypt/decrypt
) para mí (soy consciente del problema del bloque ECB y del hecho de que MySQL registra datos confidenciales en texto sin formato si no se configura correctamente) - Utilice un proveedor de bases de datos que ofrezca cifrado en reposo (el tipo que ocurre de forma transparente: encripte automáticamente en
SET
y descifre enSELECT
)
Preguntas
Pregunta 1
¿Por qué alguna vez elegiría este tipo de cifrado en reposo sobre aes_encrypt
? (Como nota, no estoy almacenando información de la tarjeta de crédito o cualquier otra cosa que me aliente legalmente a cifrar en silencio).
Tal como lo entiendo, el punto de cifrar los datos en la base de datos es confrontar la realidad de que se producen violaciones de la base de datos. Teniendo eso en cuenta, si alguien obtiene acceso a mi base de datos (lo que significa que puede ejecutar consultas), ¿este tipo de cifrado en reposo no les ayudaría realmente porque simplemente descifraría los datos cuando SELECT
? Me parece que está ralentizando las consultas sin agregar seguridad.
aes_decrypt
, por otro lado, requiere que el intruso tenga acceso a una clave almacenada en una máquina diferente detrás de credenciales diferentes. ¿No es eso más seguro?
Pregunta 2
En el escenario que describí en la pregunta 1, un atacante obtuvo acceso de consulta a una base de datos. Si ese es el caso, ¿no podrían simplemente habilitar el registro y recuperar la clave AES de texto sin formato, lo que también hace que aes_encrypt
sea inútil?
(Recuerde la restricción número 2 aquí.)
Pregunta 3
Excluyendo la inyección de sql, ¿hay otros escenarios en los que un atacante podría ver lo que hay en mi base de datos sin ejecutar un SELECT
y, por lo tanto, sin activar un descifrado transparente en reposo?
¿Recomendaciones?
Si tiene alguna recomendación que se ajuste a mis limitaciones, hágamelo saber. ¡Gracias!