La criptografía insegura que deberías dejar de usar

Gonzalo Álvarez Marañón    12 noviembre, 2019
La criptografía insegura que deberías dejar de usar

DES es inseguro, pero ¿y TripleDES? Sí, MD5 ya está roto, pero ¿qué pasa con SHA256? ¿Puedo seguir usando RSA con 2048 bits de clave o debería pasarme a ECC? ¿El modo de encadenamiento ECB es inseguro siempre, incluso con AES? ¿Son de fiar algoritmos nuevos con nombres molones como Salsa y ChaCha?

La cuestión es: ¿qué algoritmos han quedado obsoletos con el paso del tiempo y habría que dejar de utilizar? Este artículo te ayudará a orientarte en esta espesa sopa criptográfica.

Los dos motivos fundamentales por los que un algoritmo cae en desgracia

Hay dos formas de atacar un algoritmo criptográfico:

  • La bestia: se trata de probar todas las combinaciones posibles. Se lo denomina «ataque de fuerza bruta» o de «búsqueda exhaustiva». Para llevarlo a cabo solo hace falta potencia de cómputo. Con los años, a medida que la potencia aumenta, la longitud de la clave o del hash se va quedando corta.
  • La sutil: se buscan debilidades matemáticas en el algoritmo en sí, independientemente de la longitud de sus claves o tamaños de bloque. Para llevarlo a cabo se requiere un profundo conocimiento del algoritmo y de las matemáticas implicadas. Este estudio recibe el nombre de «criptoanálisis». Con el paso del tiempo, los criptógrafos van encontrando debilidades en algunos algoritmos.

Por lo tanto, debes evitar a toda costa los algoritmos débiles y también los algoritmos robustos con claves cortas. Además, deberás evitar usos inseguros de algoritmos robustos, como por ejemplo el encadenamiento de bloques AES en modo ECB, o RSA sin relleno.

Quién es quién en criptografía

La siguiente tabla recoge los algoritmos que deberías dejar de usar y por qué otros deberías reemplazarlos.

* Pruebas de seguridad débiles, pueden seguir usándose, aunque sin garantías.

Pero vayamos viendo los detalles poco a poco, para entender mejor las recomendaciones de la tabla anterior.

Algoritmos de generación de números pseudoaleatorios

La criptografía y la aleatoriedad forman una de esas parejas inseparables, como Ramón y Cajal o como Ortega y Gasset. En criptografía necesitas números aleatorios para generar claves secretas y públicas/privadas, vectores de inicialización, salts, nonces, identificadores de sesión, etc. Un generador pseudoaleatorio de números (GPAN) se considera criptográficamente seguro (GPANCS) si es imposible predecir el siguiente valor de una secuencia por muchos valores anteriores que se conozcan (en realidad, es mucho más complicado, pero dejémoslo ahí). Obviamente, para uso criptográfico, sólo se recomiendan algoritmos GPANCS. Los lenguajes de programación suelen venir equipados con una función rand() o random(), que genera secuencias pseudoaleatorias, que pasan muchas pruebas de aleatoriedad, pero que no son criptográficamente seguras. Dependiendo de su implementación, usarán Generadores Lineales Congruenciales o Mersenne twisters. Evita siempre utilizar estas funciones rand() o random() con fines criptográficos.

Figura 1. Resultados de apariencia poco aleatoria del generador lineal congruencial para distintos parámetros de entrada.

Algoritmos de hash

Los algoritmos de hash producen un resumen de longitud fija a partir de una entrada de longitud arbitraria. Se utilizan para generar códigos de autenticación de mensajes (MAC) en servicios de integridad, para comprimir mensajes antes de su firma, para derivar claves a partir de contraseñas, para generar números pseudoaleatorios, para cifrar, y mucho más.

Para considerarse criptográficamente seguras, las funciones de hash deben satisfacer al menos tres propiedades:

  • Resistencia a la preimagen: dado un hash, es imposible encontrar un mensaje cualquiera que produzca el mismo hash.
  • Resistencia a la segunda preimagen: dados un mensaje y su hash, es imposible encontrar otro mensaje que produzca el mismo hash.
  • Resistencia a colisiones: es imposible encontrar dos mensajes cualesquiera que produzcan el mismo hash.

Además, la longitud del hash debe ser suficientemente larga como para prevenir los ataques de fuerza bruta. Teniendo en cuenta la potencia de cómputo actual y el hipotético futuro post-cuántico, se recomiendan longitudes de hash de al menos 256 bits.

Por otro lado, los ataques de extensión de longitud funcionan contra los algoritmos de hash basados en la construcción de Merkle–Damgård, comoMD5, SHA-1 y SHA-2, cuando se usan a modo de MAC. Se puede seguir utilizando la familia SHA-2, siempre que se trunquen las salidas a una longitud menor, como por ejemplo SHA-512/256.

Algoritmos de cifrado simétrico o de clave secreta

Los algoritmos de criptografía simétrica se utilizan fundamental para proteger la confidencialidad de la información. Emplean la misma clave secreta tanto para cifrar como para descifrar, esta clave debe tener una longitud mínima de 128 bits para considerarse segura hoy y en el futuro próximo.

Pero hay un asunto más, los algoritmos de cifrado en bloque dividen la información a cifrar en bloques de una longitud determinada, por ejemplo, 256 bits. Cada bloque se va cifrando uno por uno, usando la misma función de cifrado con la misma clave. Esta forma de encadenar los bloques así sin más se conoce como ECB y resulta vulnerable ya que bloques idénticos darán como resultado bloques cifrados idénticos.

Figura 2. La vulnerabilidad del modo de encadenamiento de bloques ECB: a la izquierda, la imagen original; a la derecha, la misma imagen cifrada en modo ECB (Imágenes de Wikipedia).

Para evitarlo, se utilizan distintos modos de encadenamiento, los cuales no están exentos de problemas. Por ejemplo, el encadenamiento CBC es susceptible a un ataque de oráculo de relleno. La recomendación actual es utilizar AES-GCM.

Algoritmos de cifrado asimétrico o de clave pública

En cambio, la criptografía asimétrica utiliza una pareja de claves pública y privada para cifrar y descifrar. Su uso principal es la creación de firmas digitales y el establecimiento de claves de sesión.

Los algoritmos más usados hoy en día tanto para cifrar como para firmar son RSA, basado en el problema de la factorización, y la criptografía de curva elíptica (ECC), basada en el problema del logaritmo discreto. En RSA es especialmente importante resaltar que nunca bajo ningún concepto debe utilizarse directamente en lo que se conoce como su versión «libro de texto», ya que sería susceptible a todo tipo de ataques:

Y eso por no mencionar los ataques contra implementaciones deficientes, como los ataques de temporización, los ataques de canal lateral o, ya puestos, el ataque de Bleichenbacher contra RSA PKCS#1 v1.5, tristemente de moda tras el reciente ataque ROBOT.

En implementaciones reales en protocolos resulta necesario utilizar relleno y otros mecanismos de protección, como RSA-OAEP, así como claves equivalentes a una seguridad de algoritmo simétrico de al menos 128 bits. Para RSA, supone claves públicas de 3072 y para ECC, de 256 bits.

Dependiendo del tipo de algoritmo, la longitud de clave requerida puede variar sustancialmente, como puede apreciarse en la siguiente tabla y en el gráfico que la acompaña. Se puede encontrar una exhaustiva recomendación de longitudes de clave en la página de BlueKrypt.

Figura 3. Equivalencia entre las distintas longitudes de claves para AES, RSA y ECC (a partir de las recomendaciones del NIST de 2019 para gestión de claves).

Algoritmos de firma digital

La firma digital permite verificar que un mensaje no ha sido manipulado y además ha sido firmado por una persona determinada. Es más, el firmante no podrá echarse atrás y afirmar que no firmó el documento.

Para firmar digitalmente se utiliza una combinación de hashes y criptografía asimétrica: el mensaje a firmar primero se resume mediante una función de hash, el cual se cifra por el signatario con su clave privada, operación que nadie más en el mundo puede realizar, ya que se supone que él es la única persona que conoce esta clave privada. En cambio, cualquiera que conozca su clave pública puede verificar esta firma.

Al igual que al hablar de la criptografía asimétrica, en la firma se utilizan los mismos algoritmos RSA o ECC. Y también deben ser implementados cuidadosamente o se cometerán errores épicos. Se recurre por tanto a RSA-PSS y, aunque ECDSA se usa ampliamente, lo cierto es que no existen pruebas sólidas de su seguridad y sí algunos problemas menores. Como ves, la criptografía es extremadamente compleja. Ante la duda, déjate guiar por la tabla. Y si quieres profundizar en el tema, puedes leer el informe Algorithms, Key Size and Protocols Report (2018) publicado por la iniciativa europea ECRYPT-CSA, en el cual me he basado libremente para elaborar este artículo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.