Listado completo de tutoriales

84 - Encriptación de datos (aes_encrypt - aes_decrypt)


Si necesitamos almacenar un valor que no queremos que se conozca podemos encriptar dicho valor, es decir, transformarlo a un código que no pueda leerse.

La primeras versiones de MySQL contaban con dos funciones llamadas "encode" para encriptar una cadena y "decode" para desencriptarla.

El algoritmo que emplean las funciones antes nombradas son actualmente vulnerables y no deben utilizarse (en la versión 8.x de MySQL se han eliminado), en su lugar contamos con otras dos funciones llamadas "aes_encrypt" y "aes_decrypt".

Estas dos funciones permiten encriptar y desencriptar datos usando el algoritmo oficial AES (Advanced Encryption Standard) que actualmente es el más seguro.

La sintaxis de la función aes_encrypt es:

aes_encrypt("dato a encriptar","clave de encriptación")

La función recibe dos parámetros, el dato a cifrar y la clave que nosotros definimos. Retorna un valor de tipo blob.

Luego en la tabla almacenamos el dato encriptado (blob), si alguien puede acceder a los datos de la tabla no podrá conocer el valor real almacenado debido a que está cifrado.

Servidor de MySQL instalado en forma local.

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones SQL:

drop table if exists clientes;

create table clientes(
  nombre varchar(50),
  mail varchar(70),
  tarjetacredito blob,
  primary key (nombre)
);

insert into clientes 
  values ('Marcos Luis','marcosluis@gmail.com',aes_encrypt('5390700823285988','xyz123'));
insert into clientes 
  values ('Ganzalez Ana','gonzalesa@gmail.com',aes_encrypt('4567230823285445','xyz123'));
insert into clientes 
  values ('Lopez German','lopezg@yahoo.com',aes_encrypt('7840704453285443','xyz123'));

-- Si accedemos al campo tarjetacredito podemos comprobar que se encuentra cifrado.
select tarjetacredito from clientes;
  
-- Para descifrar la tarjeta de crédito debemos conocer la clave de cifrado: 'xyz123':
select cast(aes_decrypt(tarjetacredito, 'xyz123') as char) from clientes;

Genera una salida similar a esta:

MySQL aes_encrypt aes_decrypt

Retornar