Skip to main content

Cifrado de credenciales y gestión de claves

Cada base de datos aprovisionada tiene una contraseña real en MySQL — esa contraseña se guarda cifrada del lado del plano de control, nunca en texto plano.

Sin la clave, es irrecuperable para siempre

El cifrado es simétrico: sin la clave exacta, el intento de descifrado devuelve NULL, no un error. Si se pierde la clave de cifrado, todas las contraseñas ya cifradas quedan irrecuperables permanentemente — no hay proceso de recuperación posible. Por eso la clave se respalda en una ubicación completamente distinta de donde vive el backup del propio plano de control (nunca el mismo disco o bucket).

Validación obligatoria al arrancar​

El backend verifica, antes de aceptar tráfico, que la clave de cifrado configurada coincide con el hash ya registrado en la base de datos. Si no coincide, el proceso no arranca — se prefiere una falla explícita e inmediata a operar silenciosamente produciendo descifrados corruptos que nadie notaría hasta que un usuario reportara una contraseña que no funciona.

Por qué rotar la clave no es un endpoint HTTP​

Rotar la clave de cifrado es una operación de altísimo privilegio — literalmente puede volver irrecuperables todas las credenciales del sistema si algo sale mal. Por eso, a propósito, no existe como endpoint HTTP: se invoca directamente contra la base de datos con acceso administrativo restringido, nunca a través de la superficie pública del backend.

El Stored Procedure de rotación descifra cada fila con la clave vieja y la re-cifra con la nueva, todo dentro de una única transacción — si la clave vieja resulta incorrecta para una sola fila, toda la rotación se aborta, no queda nada a medio rotar. Es el mismo patrón de "todo o nada" descrito en Convenciones de Stored Procedures.

Flujo de rotación (alto privilegio, fuera del backend HTTP)
Operador con acceso administrativo directo a la base
│
▼
Stored Procedure de rotación (clave vieja, clave nueva)
│ - descifra cada fila con la clave vieja
│ - re-cifra con la clave nueva
│ - TODO dentro de una sola transacción
▼
Si una sola fila falla → rollback completo, nada queda a medio rotar
Si todo tiene éxito → el hash de verificación se actualiza
│
▼
Se actualiza la clave en la configuración del backend y se reinicia el proceso