Saltar al contenido

Evolución de SHA (Secure Hash Algorithm). En los últimos Año

image_print

Autor: Jesús R. Colmenares Centro de Seguridad Informática y Certificación Electrónica (CESICE)-FIIIDT

RESUMEN

SHA (Secure Hash Algorithm, Algoritmo de Hash Seguro) es una familia de funciones hash publicadas por el Instituto Nacional de Normas y Tecnología, INNT de Estados Unidos.  La primera versión del algoritmo se creó en 1993 con el nombre de SHA, aunque en la actualidad se la conoce como SHA-0 para evitar confusiones con las versiones posteriores. La segunda versión del sistema, publicada con el nombre de SHA-1, fue publicada dos años más tarde. Posteriormente se han publicado SHA-2 en 2001 (formada por diversas funciones: SHA-224, SHA-256, SHA-384, y SHA-512) y la más reciente, SHA-3, que fue seleccionada en una competición de funciones hash celebrada por el NIST en 2012. Esta última versión se caracteriza por ser la que más difiere de sus predecesoras.

El uso de los hashes se remonta a los inicios de la electrónica y la informática. En el año de 1.953, el investigador de IBM, Hans Peter Luhn propuso una forma de buscar y validar rápidamente información y documentos que se transformaría en lo que hoy llamamos función resumen o hash. Luego de este trabajo inicial, se produjo una intensa investigación que dio origen al trabajo Indexing for rapid random-access memory, presentado por Arnold I. Dumey en 1.956. Finalmente, el investigador W.W. Peterson trabajo en una aproximación práctica en 1.957 y en 1961, Peterson creó la primera función hash conocida, la Cyclic Redundancy Check (Comprobación de Redundancia Cíclica) o CRC.

El objetivo de esta función era la de comprobar los datos transmitidos en redes y en sistema de almacenamiento digital. En ese entonces, su uso estaba bastante limitado a espacios académicos y militares. Pero su utilidad rápidamente permitió la expansión de la misma a la industria civil. Así en la actualidad CRC es la función más usada en el mundo y podemos verla implementada en casi todo aparato electrónico que existe en la actualidad.

Con el avance tecnológico de los años 70 y 80, especialmente en informática y computación, los investigadores comenzaron a investigar más sobre este tipo de funciones. En 1973, se presentó el trabajo The Art of Computer Programming, de D. E. Knuth y seguidamente G. D. Knott presentó Hashing Functions en 1.975. Ambos libros sentaban las bases para el diseño de funciones hash en sistemas informáticos. Finalmente 1.977, J. Lawrence Carter y Mark N. Wegman propusieron The Universal hash functions o las definiciones que Ralph Merkle pública en 1.979.

Todo este trabajo teórico se transforma en 1989 en la primera función hash diseñado específicamente para computadores, la función MD2, creada por Ralph Merkle. Fue acá donde comenzó la verdadera revolución de las funciones hash hasta nuestros días.

Introducción

La palabra hash es usada en el mundo de la informática para describir a una cadena de texto codificada. Una cadena formada por número y letras de longitud fija y en un orden único e irrepetible que representan a una serie de datos. Esta cadena de texto es creada gracias a una función criptográfica única conocida como función hash.

Una función hash trabaja en base a tomar una serie de datos que son organizados en una serie de bloque de datos. Estos bloques de datos son luego sometidos a una serie de procesos matemáticos y lógicos. La finalidad de estos procesos es transformar todos los bloques de datos en una cadena alfanumérica única, irrepetible y de longitud. En dicha cadena se plasma toda la información de los bloques de datos sometidos al proceso de hashing. Dicho de una forma más sencilla, esta función lo que hace es resumir una gran cantidad de datos en una cadena mucho más pequeña, irrepetible y con una longitud fija. De allí a que estas funciones sean también conocidas como funciones de resumen o funciones de verificación.

Este funcionamiento presenta una enorme ventaja. Y es que, el proceso de hashing solo puede hacerse en un sentido. Es decir, es imposible obtener los datos originales de los bloques teniendo tan solo el resultado en nuestras manos. Gracias a esto es posible crear un documento digital, someterlo a un proceso de hashing y usar dicho resultado como una prueba de autenticidad y no modificación. Esto pues cualquier modificación que hagamos en el documento dará como resultado un hash distinto y podremos darnos cuenta de la manipulación del mismo.

Una de las principales razones que nos llevaron a desarrollar estas funciones era conseguir un medio que garantizara la seguridad de la información digital. Esto significa que dichas funciones debían ser también muy seguras para evitar que un hacker pudiera romperlas y así alterar la información que estas pudieran proporcionar. Esto se logró usando una aproximación muy cercana a la criptografía, tanto así, que se usan prácticamente los mismos principios para desarrollar funciones hash. Si bien, la seguridad absoluta no existe, pero las funciones hash actuales son muy seguras y confiables.

Por supuesto, existen funciones más seguras que otras. Especialmente cuando hablamos de funciones certificadas o bien estudiadas como el caso de SHA-256 o SHA-512. Pero en todos los casos, la seguridad de las funciones hash actuales garantiza que nadie podrás saltarse su seguridad.

Un ejemplo de esto es SHA-256, una función muy utilizada en la actualidad y que es catalogada como muy segura. Para que un hacker logre romper SHA-256 necesitaría un enorme poder computacional. Tanto que ni todas las supercomputadoras del mundo le bastarían para lograrlo en un corto periodo de tiempo. Si en lugar de SHA-256, nombramos funciones como SHA-3 (Keccak), Blake3 o Scrypt este nivel de seguridad aumenta exponencialmente.

MATERIALES Y MÉTODOS

Características de las funciones hash

Una de las principales características de las funciones hash es que estas no son reversibles. Esto significa que un hash no puede convertirse en la serie de datos que dieron origen al mismo. Esta imposibilidad de obtener el mensaje original a partir del resumen obtenido se puede explicar con la aritmética modular (mod). Y es que estos deben ser computacionalmente fáciles y rápidos de obtener.

Por otro lado, los hashes ofrecen la capacidad de ser altamente resistentes a las colisiones. Es decir, dos series de datos distintos no pueden dar origen a un mismo resultado. Esto garantiza que las funciones siempre den como resultado cadenas de textos únicas e irrepetibles bajo cualquier condición.

Otra de las características elementales de los hashes es que el resultado de sus funciones tiene una longitud fija. Las funciones hash dependiendo de su construcción ofrecerán resultado de 16, 32, 48, 64, 128, 256 o más caracteres fijos.

Todo esto tiene un importante impacto en la usabilidad. Especialmente cuando hablamos de verificación, autenticación y manejo de integridad de datos.  Lo mejor de todo, es que la mayoría de estas funciones son de dominio público y sus implementaciones son software libre.

Implementaciones en lenguajes comunes

Las funciones hash SHA se pueden encontrar en muchos de los lenguajes de programación modernos, como por ejemplo C, C++, C#, Go,25​ Javascript, Java,26​ Python,27​ PHP,28​ Perl,29​ y Ruby.30​

Otras implementaciones

Bouncy Castle

La biblioteca Bouncy Castle es una biblioteca gratuita escrita en Java y en C# que contiene implementaciones de los algoritmos SHA-1, SHA-224, SHA-256, SHA-384 y SHA-512, así como de otros algoritmos como Whirlpool, Tiger, RIPEMD, GOST-3411, MD2, MD4 y MD5.

Cryptlib

Biblioteca con herramientas de seguridad software, siendo esta multiplataforma y de código abierto.

Crypto++

Biblioteca en C++ con esquemas criptográficos e implementaciones de los algoritmos SHA-1, SHA-224, SHA-256, SHA-384 y SHA-512. Es de código abierto y con una licencia muy permisiva.

Jssha

Biblioteca escrita en JavaScript para realizar cálculos del tratamiento del SHA en la parte del cliente. Se puede utilizar en varios navegadores webs. jsSHA trabaja con la hipótesis de que JavaScript no es nativamente soportado para realizar operaciones de 64 bits tal como son requeridas en SHA-384 y SHA-512.

Libsparkcrypto

Implementación formalmente verificada que es usada ampliamente en algoritmos simétricos criptográficos en el lenguaje de programación y herramientas del SPARK. Completa la falta de errores en tiempo de ejecución como violaciones de rango, divisiones por cero y desbordamiento numérico.

LibTomCrypt

Conjunto de herramientas portables de criptografía para ISO C. Todas ellas de dominio público.

Libgcrypt

Biblioteca de propósito general para la criptografía basada en código de GNU Privacy Guard.

md5deep

Conjunto de programas para realizar un tratamiento en mensajes empleando MD5, SHA-1, SHA-256, Tiger, o Whirlpool con un número de arbitrario de ficheros. Suele ser empleada en seguridad informática, administración de sistemas y comunidades de computación forense para ejecutar gran número de ficheros a través de diversos algoritmos criptográficos. Es similar al sha1sum de GNU Core Utilities y al md5sum.

OpenSSL

La ampliamente usada biblioteca OpenSSL crypto incluye implementaciones de los algoritmos de SHA-1, SHA-224, SHA-256, SHA-384 y SHA-512. Todas ellas son libres y de código abierto.

PolarSSL

La pequeña biblioteca PolarSSL crypto y SSL incluye implementaciones de código abierto de los algoritmos de SHA-1, SHA-224, SHA-256, SHA-384 y SHA-512.

Sphlib

Bliblioteca libre y de código abierto que implementa varias funciones hash, incluyendo SHA-1 y SHA-2, ambas portables (pero optimizadas) a C y a Java.

VHDL

Colección de implementaciones hardware de funciones hash (incluyendo SHA-1 y SHA-2) portable (pero optimizada) a VHDL. Es libre y de código abierto.

Versiones de SHA

A lo largo de su historia, se han puesto a prueba esta familia de algoritmos:

SHA-0 en 1998 se encontró una vulnerabilidad en SHA-0, aunque esta no se podía hacer extensiva a SHA-1. En cualquier caso, la NSA aumentó en ese momento la seguridad del SHA-1.

SHA-1

Fue la primera versión de una familia de funciones conocida como SHA (Secure Hash). Esta primera versión se implementó en 1995 con el objetivo de sustituir a MD5 como estándar de seguridad. La función fue considerada segura hasta 2017 cuando Google presentó evidencia de la primera colisión de SHA-1. Desde entonces, el uso de SHA-1 se ha ido reduciendo. La función hash SHA-1 da como resultado una cadena de texto compuesta por 40 caracteres.

Por ejemplo, un archivo de texto que tenga la siguiente:

Cadena de texto “Hola mundo«

resultado lo siguiente: 78478919cdb0edece11c15b5d3666bfc3db946d7

ha sido examinado muy de cerca por la comunidad criptográfica pública y no se ha encontrado ningún ataque eficaz. No obstante, en el año 2004, se dio a conocer un número significativo de ataques contra funciones criptográficas de hash con una estructura similar a SHA-1, lo que plantea dudas sobre la seguridad a largo plazo de SHA-1.

SHA-0 y SHA-1 producen una salida resumen de 160 bits (20 bytes) de un mensaje que puede tener un tamaño máximo de 264 bits, y se basa en principios similares a los usados por el profesor Ronald L. Rivest del MIT en el diseño de los algoritmos de resumen de mensaje MD4 y MD5.

La codificación hash vacía para SHA-1 corresponde a:

cadena de texto “ «

resultado lo siguiente: da39a3ee5e6b4b0d3255bfef95601890afd80709

Ataques contra SHA-1

En 2004 se encontró una debilidad matemática en SHA-1,3 que p[MD5]] (264).

La resistencia del algoritmo SHA-1 se ha visto comprometida a lo largo del año 2005. Después de que MD5, entre otros, quedara seriamente comprometido en el 2004 por parte de un equipo de investigadores chinos, 4 el tiempo de vida de SHA-1 quedó sentenciado. El mismo equipo de investigadores chinos, compuesto por Xiaoyun Wang, Yiqun Lisa Yin y Hongbo Yu (principalmente de la Shandong University en China), ha demostrado que son capaces de romper el SHA-1 en al menos 269 operaciones, unas 2000 veces más rápido que un ataque de fuerza bruta (que requeriría 280 operaciones). Los últimos ataques contra SHA-1 han logrado debilitarlo hasta 263.5

Según el NIST:

«Este ataque es de particular importancia para las aplicaciones que usan firmas digitales tales como marcas de tiempo y notarías. Sin embargo, muchas aplicaciones que usan firmas digitales incluyen información sobre el contexto que hacen este ataque difícil de llevar a cabo en la práctica.»

A pesar de que 263 suponen aún un número alto de operaciones, se encuentra dentro de los límites de las capacidades actuales de cálculos, y es previsible que con el paso del tiempo romper esta función sea trivial, al aumentar las capacidades de cálculo y al ser más serios los ataques contra SHA-1.

El 23 de febrero de 2017, un equipo formado por Google y CWI Amsterdam, han anunciado la primera colisión de SHA-1, la cual ha sido nombrada como SHAttered.

La importancia de la rotura de una función hash se debe interpretar en el siguiente sentido: Un hash permite crear una huella digital, teóricamente única, de un archivo. Una colisión entre hashes supondría la posibilidad de la existencia de dos documentos con la misma huella. La inicial similitud propuesta con la equivalencia a que hubiese personas que compartiesen las mismas huellas digitales, o peor aún, el mismo ADN no es adecuado pues, aunque fuera trivial encontrar dos ficheros con el mismo resumen criptográfico ello no implicaría que los ficheros fueran congruentes en el contexto adecuado. Siguiendo con la hipótesis de la similitud biométrica de dos personas, sería el equivalente a necesitar modificar el número de brazos en una persona para que su impresión dactilar fuera igual a la de otra.

A pesar de que el NIST contempla funciones de SHA de mayor tamaño (por ejemplo, el SHA-512, de 512 bits de longitud), expertos de la talla de Bruce Schneier abogan por, sin llamar a alarmismos, buscar una nueva función hash estandarizada que permita sustituir a SHA-1. Los nombres que se mencionan al respecto son Tiger, de los creadores de Serpent, y WHIRLPOOL, de los creadores de AES.

SHA-256

Esta es una de las funciones que pertenecen a la familia SHA. SHA-256 es considerado en la actualidad el hash estándar de la industria. Considerado como muy seguro, SHA-256 es capaz de ofrecernos una alta seguridad requiriendo de muy poco poder de cómputo. Por esta razón, Satoshi Nakamoto eligió SHA-256 como algoritmo para la creación de la criptomoneda Bitcoin. Una función SHA-256 da como resultado una cadena de texto compuesta por 64 caracteres.

cadena de texto “Hola mundo «

resultado lo siguiente:

226d3bded5198fb5f2a79c3d72e704e5fe8e8524273c7d9bafa85077dc4ea7f6

SHA-3 (Keccak)

Es la última adición a la familia de funciones hash SHA. A diferencia de las anteriores versiones, SHA-3 funciona desde una lógica de hashing completamente distinta. Como resultado su nivel de seguridad es superior, así como ha sido optimizada para el hardware de computadoras modernas de hoy en día. Una de las principales ventajas es que su nivel de dificultad puede ser ajustada y de allí tenemos opciones como SHA3-224, SHA3-256, SHA3-384 y SHA3-512. De ellos la opción estándar es SHA3-256.

Sin embargo, hay que destacar que SHA-3 proviene de un grupo de sistemas de hashing más amplio conocido como Keccak. Tanto Keccak como SHA-3 usan el mismo principio de hashing, pero se diferencian en sus valores de codificación. Esto origina que al usar alguna de las opciones SHA-3 o Keccak, los hashes arrojados sean distintos.  Pese a estas diferencias la salida del hash es la misma y es de un total de 64 caracteres para la versión estándar de 256 bits.

Uno de los proyectos más emblemáticos que hace uso intensivo de SHA-3 (en su variante Keccak) es Ethereum. Esta criptomoneda creada por Vitalik Buterin usa Keccak-256 para su proceso de hashing y minería de criptomonedas.

cadena de texto “Hola mundo «

resultado lo siguiente:

29f12fce7c26ed8e1768b8a315ad012ae64ae444e570307e750ca01c4a9c94ad

Pero si usamos Keccak-256, obtendremos el siguiente resultado:

15885257b8e66fa2bf0d30cd1cd2c56c9136e196aee4545cdabd0895f58aab8a

Referencias

1.            ↑ «List of current FIPS publications» (en inglés). NIST. 14 de diciembre de 2017. Archivado desde el original el 14 de diciembre de 2017. Consultado el 25 de diciembre de 2017.

2.            ↑ Saltar a:a b Tim Polk, Lily Chen, Sean Turner, Paul Hoffman (31 de marzo de 2011). «Security Considerations for the SHA-0 and SHA-1 Message-Digest Algorithms» (txt). IETF (en inglés). Archivado desde el original el 11 de agosto de 2012. Consultado el 3 de noviembre de 2018. «The Secure Hash Algorithms are specified in [SHS]. A previous version of [SHS] also specified SHA-0. SHA-0, first published in 1993, and SHA-1, first published in 1996, are message digest algorithms, sometimes referred to as hash functions or hash algorithms, that take as input a message of arbitrary length and produce as output a 160-bit «fingerprint» or «message digest» of the input.»

3.            ↑ Schneier, Bruce (18 de febrero de 2005). «SHA-1 Broken» (html). Bruce Schneier’s Blog (en inglés). Archivado desde el original el 17 de diciembre de 2018. Consultado el 17 de diciembre de 2018. «The research team of Xiaoyun Wang, Yiqun Lisa Yin, and Hongbo Yu (mostly from Shandong University in China) have been quietly circulating a paper announcing their results: collisions in the the full SHA-1 in 2**69 hash operations, much less than the brute-force attack of 2**80 operations based on the hash length. collisions in SHA-0 in 2**39 operations. collisions in 58-round SHA-1 in 2**33 operations.»

4.            ↑ Xiaoyun Wang, Dengguo Feng, Xuejia Lai, Hongbo Yu (17 de agosto de 2004). «Collisions for Hash Functions MD4, MD5, HAVAL-128 and RIPEMD» (pdf). International Association for Cryptologic Research (en inglés). Archivado desde el original el 20 de diciembre de 2004. Consultado el 17 de diciembre de 2018.

5.            ↑ Schneier, Bruce (18 de febrero de 2005). «Cryptanalysis of SHA-1» (html). Bruce Schneier’s Blog (en inglés). Archivado desde el original el 21 de febrero de 2005. Consultado el 17 de diciembre de 2018. «SHA-1 produces a 160-bit hash. That is, every message hashes down to a 160-bit number. Given that there are an infinite number of messages that hash to each possible value, there are an infinite number of possible collisions. But because the number of possible hashes is so large, the odds of finding one by chance is negligibly small (one in 280, to be exact). If you hashed 280 random messages, you’d find one pair that hashed to the same value. (…) They can find collisions in SHA-1 in 269 calculations, about 2,000 times faster than brute force. Right now, that is just on the far edge of feasibility with current technology. Two comparable massive computations illustrate that point.»

 

Contacto: ramses.wolverine@gmail.com

Compartir en Redes Sociales
0 Shares