En el universo de la Seguridad de la Información existen miles de vectores por donde un cibercriminal puede eludir las barreras de distinto nivel para extraer información valiosa. Un ejemplo importante son las bases de datos; por esta razón veremos por qué se debe cifrar lo que se aloja en un servidor de bases de datos y cómo podemos brindarle un cifrado más robusto a nuestra información.
Muchas veces un administrador gestiona los niveles de seguridad pertinentes para proteger sus aplicaciones y sistemas, y así evitar que un intruso logre obtener algún tipo de ventaja para acceder a información confidencial. Pero ¿es posible hacer algo más? Sí.
Cuando tenemos datos sensibles, como por ejemplo información de tarjetas de crédito, datos médicos o de cualquier otro tipo que tenga un nivel alto de valor para el negocio, es crucialmente importante que esta información no se encuentre en texto plano, ya que estaríamos exponiendo y facilitando innecesariamente a un cibercriminal su labor, en el caso de que ocurra un incidente de seguridad.
¿Qué es AES y cómo aplicarlo en MySQL?
Advanced Encryption Standard (AES) es un algoritmo de cifrado simétrico. ¿Qué quiere decir esto? Que requiere una contraseña para descifrar la información. Este esquema permite claves de un tamaño máximo de 256 bits, por lo cual es considerado uno de los protocolos más seguros del mundo.
MySQL es un sistema de administración de bases de datos relacional, que provee la capacidad de cifrar la información con el algoritmo de AES. Se puede hacer llamada a la función con los siguientes comandos: para cifrar, AES_ENCRYPT y para descifrar, AES_DECRYPT. Como concepto básico y fundamental, la función recibe dos parámetros, el texto a cifrar y la password que nosotros selecionamos. Cabe destacar que la implementacion del cifrado en una base de datos depende en gran parte de como se diseñó y desarrolló la aplicación.
A continuación podemos ver un ejemplo de cómo aplicar el cifrado, en donde a la función le indicamos la información y la contraseña con la que queremos cifrar. Además, aplicamos otra funcion HEX, que devuelve el valor hexadecimal de la funcion AES. Este paso lo hacemos para poder apreciar de manera legible el valor retornado:
[shell]
mysql> SELECT @@session.block_encryption_mode;
+---------------------------------+
| @@session.block_encryption_mode |
+---------------------------------+
| aes-128-ecb |
+---------------------------------+
1 row in set (0.00 sec)
[/shell]
Esto no es 100% seguro (¿acaso algo lo es?) ya que por defecto, MySQL tiene configurado AES en 128 bits. Esta no es la configuracion que AES tiene como estándar para que el cifrado sea completamente seguro; para ello, tendríamos que cambiar a 256 bits. Con el objetivo de conocer de qué manera está configurado el algoritmo, debemos consultar a la variable block_encryption_mode, como indicamos a continuación:
[shell]
mysql> SELECT HEX(AES_ENCRYPT('Informacion', 'passwordSegura'));
+---------------------------------------------------+
| HEX(AES_ENCRYPT('Informacion', 'passwordSegura')) |
+---------------------------------------------------+
| 4062734278A314418B6AC1900551F2D7 |
+---------------------------------------------------+
1 row in set (0.00 sec)
[/shell]
Como pudimos comprobar, el cifrado no es del todo seguro y por lo tanto, debemos aplicar los cambios necesarios para que sí lo sea. Con la instrucción SET y el parámetro “aes-256-ecb”, lograremos los cambios que buscamos, como se describe a continuación:
[shell]
mysql> SET @@session.block_encryption_mode = 'aes-256-ecb';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@session.block_encryption_mode;
+---------------------------------+
| @@session.block_encryption_mode |
+---------------------------------+
| aes-256-ecb |
+---------------------------------+
1 row in set (0.00 sec)
[/shell]
Ahora sí, el cifrado AES está correctamente configurado con 256 bits. Por lo tanto, volveremos a usar la función como hicimos anteriormente, y obtendremos un valor diferente al anterior pero con un cifrado más robusto:
[shell]
mysql> SELECT HEX(AES_ENCRYPT('Informacion', 'passwordSegura'));
+---------------------------------------------------+
| HEX(AES_ENCRYPT('Informacion', 'passwordSegura')) |
+---------------------------------------------------+
| B18464A9F19465BFA2E59F2476E7C095 |
+---------------------------------------------------+
1 row in set (0.00 sec)
[/shell]
Para verificar que nuestros datos fueron cifrados correctamente, utilizaremos las funciones inversas AES_DECRYPT y UNHEX.
- UNHEX recibe como único parámetro el valor en hexadecimal
- AES_DECRYPT recibe el dato devuelto por la función anterior y la password
Esto se indica a continuación:
[shell]
mysql> SELECT AES_DECRYPT(UNHEX('B18464A9F19465BFA2E59F2476E7C095'),'passwordSegura');
+-------------------------------------------------------------------------+
| AES_DECRYPT(UNHEX('B18464A9F19465BFA2E59F2476E7C095'),'passwordSegura') |
+-------------------------------------------------------------------------+
| Informacion |
+-------------------------------------------------------------------------+
1 row in set (0.02 sec)
[/shell]
Cada compañía debería evaluar qué datos son críticos y valiosos como para ser cifrados, teniendo en cuenta su impacto en la performance del sistema y el negocio. Desde el lado del desarrollador, la cuestión comienza a ser diferente ya que no solo se debe preocupar por el correcto funcionamiento de la aplicación, sino también de cómo se manipulan y protegen los datos.
En definitiva, el cifrado de bases de datos es una buena práctica para prevenir y protegerse del robo de información, de posibles malas configuraciones o ataques informáticos que una empresa podría experimentar.