Para proporcionar un fondo rápido, necesitamos implementar una solución donde podamos garantizar que la información se almacene encriptada. El acceso a los datos de cifrado solo será posible a través de una aplicación que tenga acceso dedicado a la base de datos. Con cada "solicitud" a esta aplicación, se proporcionarán detalles de autenticación que luego se utilizarán para crear un registro de quién ha leído qué información y cuándo.
Mis principales requisitos son:
- MySQL 5.5
- La base de datos se replicará con fines de copia de seguridad. Uno debería poder restaurar desde dicha base de datos replicada, pero al acceder a una base de datos replicada no debería poder leer ninguna información.
Mi idea es utilizar el cifrado a nivel de la aplicación y almacenar valores cifrados explícitos en la base de datos. Es decir, a nivel técnico, la base de datos no tiene forma de saber que la información está encriptada. La "estructura" real de la base de datos (tablas, columnas, etc.) no es algo que consideremos secreto. Para implementar el cifrado a nivel de la aplicación, estoy pensando en aplicar AES_ENCRYPT / AES_DECRYPT que está integrado en MySQL, usando una frase de contraseña que solo conoce la aplicación.
¿Alguien ve un problema con este enfoque? Seguramente, la frase de contraseña debe mantenerse en secreto. Si la frase de paso se filtraría, creo que sería trivial volver a cifrar todos los valores con una nueva frase de paso. No se espera que la base de datos sea grande, los requisitos de rendimiento son bajos. Sería fácil tener entornos de desarrollo y prueba, ya que la única diferencia sería la frase de contraseña utilizada.