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.

Diego J. Gonzalez