Asegurando nuestra información en MySQL con AES

Con tanto revuelo de bases de datos por Internet, sitios vulnerados encuentro que es un buen momento para comenzar a diciplinar en ciertas artes a las cuales no se les presta atención. Una de ellas es la seguridad básica en nuestra base de datos MySQL o MariaDB (la volveremos mas completa a medida de que pase el tiempo) con técnicas bastante sencillas de aplicar.

Comenzaremos con una estructura simple de tabla:

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_first_name` varbinary(100) DEFAULT NULL,
  `user_last_name` varbinary(100) DEFAULT NULL,
  `user_email_address` varbinary(100) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB CHARSET=utf8;

Y utilizaremos dos funciones conocidas de MySQL / MariaDB:

Vamos a proceder a una inserción de información asegurada con AES_ENCRYPT:

SET @llave = 'millave';
INSERT INTO users VALUES('', AES_ENCRYPT('Barra', @llave), AES_ENCRYPT('Home', @llave), 
AES_ENCRYPT('albertof@barrahome.org', @llave));

Como pueden observar establezco el valor de @llave y luego la utilizo en mi INSERT, esto bien puede cambiar dependiendo de lo que estén por utilizar.

Seleccionamos la información en nuestra base de datos:

mysql> SELECT * FROM users;
+---------+------------------+------------------+----------------------------------+
| user_id | user_first_name  | user_last_name   | user_email_address               |
+---------+------------------+------------------+----------------------------------+
|       1 | x▒▒▒▒I\▒r▒▒▒▒▒            |
;Kc▒▒▒{▒L▒t▒▒*        | ▒?▒p▒̕▒▒t▒l▒*▒ܑp▒/▒p▒|▒▒?▒                     |
+---------+------------------+------------------+----------------------------------+
1 row in set (0.00 sec)

mysql>

Si observamos, nuestra información personal se encuentra ya protegida, exceptuando el valor de user_id el cual ocuparemos para otras referencias a futuro.

Efectuaremos una consulta pasando el valor de la llave que utilizamos y así obtendremos nuestros resultados:

mysql> SET @llave = 'millave';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT user_id AS 'ID', AES_DECRYPT(user_first_name, @llave) AS 'Nombre', 
AES_DECRYPT(user_last_name, @llave) AS 'Apellido', 
AES_DECRYPT(user_email_address, @llave) AS 'Email' FROM users;
+----+--------+----------+------------------------+
| ID | Nombre | Apellido | Email                  |
+----+--------+----------+------------------------+
|  1 | Barra  | Home     | albertof@barrahome.org |
+----+--------+----------+------------------------+
1 row in set (0.00 sec)

mysql>

Para finalizar, una consulta con parámetros usando lo anterior:

mysql> SELECT
    -> user_id AS 'ID',
    -> AES_DECRYPT(user_first_name, @llave) AS 'Nombre',
    -> AES_DECRYPT(user_last_name, @llave) AS 'Apellido',
    -> AES_DECRYPT(user_email_address, @llave) AS 'Email'
    -> FROM users
    -> WHERE user_email_address = AES_ENCRYPT('albertof@barrahome.org', @llave);
+----+--------+----------+------------------------+
| ID | Nombre | Apellido | Email                  |
+----+--------+----------+------------------------+
|  1 | Barra  | Home     | albertof@barrahome.org |
+----+--------+----------+------------------------+
1 row in set (0.00 sec)

mysql>

Una nota personal:

Se puede avanzar mucho mas con la técnica aquí mostrada, según el manual existen otras variables a tener en cuenta y podremos volver mas sofisticado este procedimiento, esto se utilizara en los próximos artículos así como una técnica la cual nos permita guardar las llaves de una forma segura.

 

Leave a Reply

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

This site uses Akismet to reduce spam. Learn how your comment data is processed.