Cifrado de columnas en MariaDB
usando AES_ENCRYPT y triggers
Este documento describe cómo implementar cifrado de columnas en MariaDB utilizando la función AES_ENCRYPT()
para almacenar datos cifrados y AES_DECRYPT()
para recuperarlos. También incluye un ejemplo con un trigger para cifrado automático al insertar datos.
1. Crear una tabla con un campo cifrado
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARBINARY(255) -- usamos VARBINARY para datos cifrados
);
2. Insertar datos cifrados manualmente
-- Insertar el nombre 'Juan' cifrado con AES usando una clave
INSERT INTO usuarios (nombre)
VALUES (AES_ENCRYPT('Juan', 'clave_secreta'));
3. Consultar y descifrar los datos
-- Ver los datos descifrados
SELECT AES_DECRYPT(nombre, 'clave_secreta') AS nombre_descifrado
FROM usuarios;
Convertir a texto legible:
SELECT CAST(AES_DECRYPT(nombre, 'clave_secreta') AS CHAR) AS nombre
FROM usuarios;
4. Cifrado automático con trigger
Crear una tabla con campo cifrado y campo en texto plano (opcional)
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre_plain VARCHAR(255), -- campo en texto plano (opcional)
nombre_cifrado VARBINARY(255) -- campo cifrado
);
Crear trigger para cifrar automáticamente antes de insertar
DELIMITER //
CREATE TRIGGER cifrar_nombre
BEFORE INSERT ON usuarios
FOR EACH ROW
BEGIN
SET NEW.nombre_cifrado = AES_ENCRYPT(NEW.nombre_plain, 'clave_secreta');
END;
//
DELIMITER ;
5. Insertar datos (ya se cifran automáticamente)
INSERT INTO usuarios (nombre_plain) VALUES ('Carlos');
6. Consultar datos cifrados y descifrarlos
SELECT
nombre_plain,
CAST(AES_DECRYPT(nombre_cifrado, 'clave_secreta') AS CHAR) AS nombre_descifrado
FROM usuarios;
Recomendaciones
- Nunca almacenes la clave de cifrado directamente en las consultas en producción.
- Usa gestión segura de claves (por aplicación o servicios como HashiCorp Vault, AWS KMS, etc.).
- Considera usar solo el campo cifrado y eliminar
nombre_plain
para evitar duplicidad de datos sensibles.