Asegurando nuestra información en MySQL con AES

Por | 9 febrero, 2016

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.

 

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.