RGPD

Últimamente cada vez más compañías se deciden a dar el paso a servicios en la nube como pueden ser Azure o AWS, normalmente se trata de una opción flexible, rentable y escalable donde ejecutar sus operaciones, de esta manera se eliminan una serie de restricciones que plantean las tecnologías on-premise.

Pero antes de cargar nuestros datos en la nube debemos tener muy en cuenta el Reglamento General de Protección de Datos RGPD o sus siglas en inglés GDPR, se trata del reglamento europeo relativo a la protección de las personas físicas en lo que respecta al tratamiento de sus datos personales y a la libre circulación de estos datos.

Según el apartado 3.8.1 del anexo 5 de Anonimización de la AEPD y las técnicas de anonimización para el cumplimiento de RGPD son los Algoritmos de Hash:

es incuestionable la utilidad que tienen los algoritmos de cifrado cuando necesitamos anonimizar microdatos, resultando especialmente útiles los algoritmos de “hash”. Un algoritmo de hash es un mecanismo que, aplicado a un dato concreto, genera una clave única o casi única que puede utilizarse para representar un dato. Por ejemplo, disponemos de un dato que queremos ocultar o anonimizar y para ello utilizamos un algoritmo de hash, como por ejemplo SHA1 o MD5. De la aplicación del algoritmo a un determinado dato obtenemos una clave o huella digital que puede utilizarse para reemplazar el dato real. El algoritmo de hash genera una huella digital y hace imposible reconstruir el dato original partiendo de la huella y por otra parte cualquier variación en el dato original dará lugar a una huella digital diferente, lo que expresado en términos computacionales podría decirse que la modificación de un solo bit en la información original almacenada en un ordenador daría lugar a una clave distinta o una huella digital distinta.

 El algoritmo de hash permite que, partiendo de un mismo dato o microdato, podamos generar siempre la misma huella digital pero partiendo de una determinada huella digital nunca podremos obtener el dato original, garantizando la confidencialidad al tratarse de una operación matemática de un solo sentido. Las claves resultantes de la aplicación de un algoritmo de hash son comúnmente conocidas como “huella digital” por entender que representan de forma unívoca a un dato o microdato concreto.

Por lo tanto, si necesitamos por ejemplo tener un identificador de un usuario para poder realizar cruces con tablas ventas, con accesos a una plataforma… no vamos a poder usar el id de la BBDD original, ni el de un datamart, no podremos usar nada que se pueda rastrear en un eventual filtrado de datos y poner al descubierto datos personales, para ello una de las técnicas que podemos usar son algoritmos de Hash.

¿Qué es un hash?

Una función criptográfica hash usualmente conocida como «hash» es un algoritmo matemático que transforma cualquier bloque arbitrario de datos en una nueva serie de caracteres con una longitud fija. Independientemente de la longitud de los datos de entrada, el valor hash de salida tendrá siempre la misma longitud.

Tienen una infinidad de usos, se utilizan para encriptar contraseñas, para comparar números, para verificar las cadenas de bloques, para encontrar posibles violaciones de copyright o para ofuscar información que no queremos que sea revelada como es el caso.

Hay muchos tipos de hash, estos son algunos de los más conocidos MD2, MD5, SHA, SHA1, SHA2_256, SHA2_512

Aquí vemos un ejemplo de la salida que nos ofrece algunos algoritmos de hash, por ejemplo para el valor de entrada ‘Solidq’

Hash Algorythm

Como vemos cada hash devuelve una cosa distinta y cada uno tiene un tamaño y complicación distinto al otro

Hackear el hash

Las formas más comunes de descifrar contraseñas, lo que suele ser lo que más les interesa a los hackers, son los ataques por el diccionario y la fuerza bruta.

Un ataque de diccionario usa un archivo que contiene palabras, frases, contraseñas comunes y otras cadenas que probablemente se usa como contraseña o hash para este caso. Cada palabra en el archivo tiene un hash, y su hash se compara con el hash de la contraseña. Si coinciden, esa palabra es la contraseña. Estos archivos de diccionario se construyen extrayendo palabras de grandes cuerpos de texto, e incluso bases de datos reales de contraseñas.

Un ataque de fuerza bruta intenta cada combinación posible de caracteres hasta una longitud determinada. Estos ataques son muy costosos desde el punto de vista computacional y, por lo general, son los menos eficientes en términos de hash crackeados por tiempo de procesador.

Por otro lado, también hay otros métodos más efectivos que los anteriores que se llaman Lookup y Rainbow tables.

Las Lookup tables son un método extremadamente efectivo para romper muchos hashes del mismo tipo muy rápidamente. La idea general es calcular previamente los hashes de las contraseñas en un diccionario de contraseñas y almacenarlas con su contraseña correspondiente en una tabla. Una buena implementación de una Lookup table puede procesar cientos de búsquedas de hash por segundo, incluso cuando contienen muchos miles de millones de hashes.

Las tablas del arco iris (Rainbow tables) son como las tablas de búsqueda, pero se sacrifica la velocidad de craqueo de hash para hacer las tablas de búsqueda más pequeñas. Es más fácil que nunca.

Hash con Salt

Las tablas de Lookup y Rainbow solo funcionan porque cada contraseña se hace de la misma manera. Para prevenir estos tipos de ataques lo que se debe hacer es meter más entropía, es decir, conseguir que los hashes ser más aleatorios, una buena manera de hacerlo es metiendo antes, después o intercalados un string al identificador que queremos anonimizar, este tipo de cadenas se llaman Salt y deben ser lo más aleatorias posibles. Desde la AEPD recomiendan este tipo de operativa:

La clave AAA reemplaza al nombre de una persona, sería posible aplicar un algoritmo de hash añadiendo texto aleatorio como AAA1k2j3j de manera que sobre el seudónimo AAA tendríamos una clave secreta (1k2j3j) que fortalecería la cadena de confidencialidad; en este  caso se debería contemplar la posibilidad de disponer de una política de claves secretas para llevar a cabo la anonimización. Si sobre la cadena AAA aplicamos un algoritmo de hash MD5, la reidentificación sería relativamente sencilla por mecanismos de fuerza bruta, mientras que el hecho de añadir texto o una clave adicional al seudónimo implicaría un mayor esfuerzo para realizar la reidentificación de una persona

Customer Key Salt

Respecto a las técnicas de hash con salt, se puede complicar todo lo que se quiera, se puede anteponer el salt al identificador, ponerlo a continuación del id e incluso intercalarlo, también se debe intentar conseguir un Salt lo más aleatorio posible. En sql server tenemos la función RAND a la que se le puede dar un seed diferente en cada ejecución y para complicar más el asunto se puede aplicar n-veces el hash sobre el resultado, siempre se tiene que tener en cuenta que el mejor hash va a ser el más lento en calcularse para que su posible hackeo no valga la pena, ahora bien también tenemos que intentar cargar nuestros datos lo más rápido posible por lo tanto deberemos dirimir esta disyuntiva en las primeras fases de nuestro proyecto para evitar sorpresas desagradables posteriores.

Calculo de Hash

  • Servidor SQL

A partir de la versión SQL server 2008 tenemos la función hashbytes con la que podemos aplicar multitud algoritmos como son

MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512

Aquí vemos un ejemplo sencillo de cálculo de hash con salt, como ya hemos dicho el salt debe ser aleatorio pero se puede ver la idea

DECLARE @Identificador nvarchar(4000);  
DECLARE @Salt nvarchar(4000); 
DECLARE @ID_Salt nvarchar(4000);  
DECLARE @Salt_ID nvarchar(4000);
SET @Identificador = CONVERT(nvarchar(4000),'11000');  
SET @Salt = CONVERT(nvarchar(4000),'8AcK707H3Fu7UR3'); 
SET @ID_Salt = @Identificador+@Salt;
SET @Salt_ID = @Salt+@Identificador;

SELECT @ID_Salt Value,'MD2'Type_Of_Hash, HASHBYTES('MD2', @ID_Salt) Hash_Value
UNION
SELECT @Salt_ID Value,'MD2'Type_Of_Hash, HASHBYTES('MD2', @Salt_ID) Hash_Value
UNION
SELECT @ID_Salt Value,'MD5'Type_Of_Hash, HASHBYTES('MD5', @ID_Salt) Hash_Value
UNION
SELECT @Salt_ID Value,'MD5'Type_Of_Hash, HASHBYTES('MD5', @Salt_ID) Hash_Value
UNION
SELECT @ID_Salt Value,'SHA1'Type_Of_Hash, HASHBYTES('SHA1', @ID_Salt) Hash_Value
UNION 
SELECT @Salt_ID Value,'SHA1'Type_Of_Hash, HASHBYTES('SHA1', @Salt_ID) Hash_Value
UNION 
SELECT @ID_Salt Value,'SHA2_256'Type_Of_Hash, HASHBYTES('SHA2_256', @ID_Salt) Hash_Value
UNION 
SELECT @Salt_ID Value,'SHA2_256'Type_Of_Hash, HASHBYTES('SHA2_256', @Salt_ID) Hash_Value
UNION
SELECT @ID_Salt Value,'SHA2_512'Type_Of_Hash, HASHBYTES('SHA2_512', @ID_Salt) Hash_Value
UNION
SELECT @Salt_ID Value,'SHA2_512'Type_Of_Hash, HASHBYTES('SHA2_512', @Salt_ID) Hash_Value
  • SSIS

Una de las formas más rápidas y sencillas de crear un hash en Integration services es el componente SSIS Multiple Hash, que se puede encontrar en la siguiente dirección MultiHash

Se puede utilizar multitud de algoritmos entre los que encontramos MD5 y SHA, podemos elegir que columnas queremos que entren en el cálculo, en las cuales podríamos meter una columna con el salt o varias y también podemos crear los Hash que queramos.

  • C#

Con el namespace System.Security.Cryptography se tiene acceso a un catálogo bastante grande de servicios criptográficos entre los que se encuentran los de hash, en este caso podemos encontrar algoritmos derivados de HMAC especialmente recomendado por la AEPD

Una buena opción es el algoritmo HMAC basado en RFC20147 HMAC puede utilizarse en combinación con varios algoritmos de hash como, por ejemplo, con MD5 y sobre la huella digital o clave resultante del algoritmo de hash aplica un algoritmo criptográfico que genera una nueva huella digital o clave en función de una clave secreta.

La utilización de HMAC en combinación con claves secretas no triviales y una política diligente de destrucción de claves puede servir para garantizar la irreversibilidad del proceso de anonimización. Cuando las claves utilizadas con HMAC se conservan pueden servir para generar datos seudonimizados que requieran una posterior reidentificación de los interesados. Mecanismos de hash con clave secreta pueden resultar útiles para enmascarar los datos. Sin embargo, deberá existir un procedimiento que permita la eliminación segura de las claves y la posibilidad de acreditar que el procedimiento se ha cumplido para garantizar la irreversibilidad del proceso.

Aquí podemos ver un ejemplo HMAC256 y aquí otro de como calcular un valor aleatorio con la clase RNGCryptoServiceProvider que podremos usar para generar un Salt.

Conclusión

Se debe tomar este post como una introducción a la materia, cada empresa debe plantearse su estrategia de cifrado con su departamento legal y el DPO debe tomar las decisiones oportunas para garantizar el cumplimiento de la normativa de protección de datos en dicha organización.

Espero que os haya gustado y si queréis saber más sobre estos temas tan candentes solo tenéis que contactarnos, tenemos varios de los mayores expertos a nivel mundial en servicios como puede ser Azure, en Data Science, AI & Data Analytics, Business Intelligence, protección de datos…

Rogelio Dosil

Data Platform Engineer at SolidQ
I am working at SolidQ as a Data Platform Engineer on BI projects. I obtained my Bachelor’s Degree in Electrical Engineering at the University of Vigo.

During the last 4 years of experience, after an initial stage in web design, I have focused my work as BI Consultant in different technologies. I have worked in different business models such as Supply Chain, Financial, Health, Database Performance and Textile.
Rogelio Dosil