Alters

Remote Tools: Otros conceptos (I) - SHA1

Buenas!

Lo prometido es deuda, y toca seguir con Remote Tools.

En esta serie de cinco entradas veremos algunos conceptos adicionales, relacionados con seguridad informática y criptografía.

¿Estáis preparados?

¡Vamos allá!


En esta entrada veremos el llamado SHA1 (Secure Hash Algorithm 1). Éste es un estándar ámpliamente usado en muchos aspectos.

Funcionamiento:

El cifrado con SHA1 se basa en la aplicación de 80 funciones linealmente.

Cada set de funciones se aplica a un bloque, hasta que queda un hash de 40 caracteres de longitud.

Aquí podéis ver cómo funciona en profundidad (en inglés).

Dicho hash, como decía, tiene una longitud fija de 40 caracteres, en formato HEX (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f).

Es decir, podemos tener una serie desde:

0000000000000000000000000000000000000000

hasta

ffffffffffffffffffffffffffffffffffffffff

Lo que nos da, exactamente, 16^40 posibles combinaciones, es decir, 1.461.501.637.330.902.918.203.684.832.716.283.019.655.932.542.976 posibles combinaciones.

Limitaciones teóricas:

¿Muchas? No lo creo.

Seamos justos, en este mundo de información, las combinaciones son casi infinitas, y lo infinito frente a lo finito es incomparable.

No te entiendo, pon un ejemplo...

¡Marchando una doble de ejemplo con guarnición!

Veamos, imaginemos, para simplificar, que tenemos el alfabeto - números incluidos -, sin acentos, con mayúsculas y minúsculas; sin "ñ", sin "ç", y sin contar la "ll" como un único carácter.

Entonces, tenemos un charset formado por:

0123456789 -> Long: 10
abcdefghijklmnopqrstuvwxyz -> Long 26
ABCDEFGHIJKLMNOPQRSTUVWXYZ -> Long 26

Esto nos da un total de 26 + 26 + 10 = 62.

Entonces, buscamos un "x" tal que:

62^x >= 16^40; x = 27

Es decir, si creamos una lista a modo numérico usando como base estos 62 caracteres, en cuanto lleguemos a 27 caracteres de longitud habremos encontrado bastantes hashes iguales, en concreto:

62^27 - 16^40 = 1019206187030478931448486091365983873888663109632, es decir, casi el mismo número de combinaciones disponibles en SHA1.

Esto quiere decir, que siendo optimistas, cada hash estaría dos veces.

¿Una logintud de 27 os parece mucho? Vamos a hilar un poco más fino. Tomemos el charset de antes, y añadamos, digamos, la variante francesa:

à â é è ê ë î ï ô ù û ü ç -> Long 13

Conste que estoy poniendo solo las combinaciones "aceptables" (realmente podría poner las 21 combinaciones).

Esto nos da un nuevo charset de 62 + 13 = 75.

Buscamos la nueva longitud:

75^x >= 16^40; x = 26

Tenemos una longitud de 26 (¡vaya cambio!), pero por otra parte, tendríamos 3.862 veces cada hash.

Podríamos ampliar el charset usando la "ñ", el resto de combinaciones anteriores, símbolos de puntuación...

Como veis, las combinaciones son realmente infinitas, puesto que se pueden cifrar archivos enteros.

¿Qué quieres decir con esto?

Imaginaos esto: en el charset ASCII hay 127 caracteres. Esto nos reduce la "x" a 23. Podríamos tener la mitad de este diccionario (puesto que la razón 127^23 / 16^40 = 1.67) comprimido en un mega-fichero, y tendríamos todo el SHA1.

¿Mega fichero?

Claro, su tamaño sería:

23*16^40 bytes (383tb)

Es decir, 16^40 combinaciones de 23 caracteres. Está claro que se puede "comprimir", puesto que, por ejemplo, los 127 registros tendrían longitud 1 (lo que nos quita 127*126 bytes, casi 2 mb).

Pero sigue siendo algo que solo los grandes podrían tener; no solo por espacio, sino por tiempo computacional.

Imaginemos que podemos hacer 1.000.000 de hash al segundo, tardaríamos 16915528209848413405135241119401423839 días.

Es decir, necesitamos una buena panda de colegas, digamos 100 personas, con una buena máquina, capaz de sacar 20.000.000 de hash por segundo, y aún así tardaríamos 8457764104924206702567620559700712 días (23156096112044371533381575796580 años).

Vamos viendo en qué se basa la fortaleza de este hash, ¿no?

No obstante, estos pensamientos están bastante anticuados... realmente hay otras maneras (que a día de hoy escapan al conocimiento general en el que me incluyo) que simplifican muchísimo la obtención de colisiones (dos textos que dan el mismo hash).

Es por ello que se han ido precediendo los SHA-X, y hoy en día podemos encontrar una amplia variedad (englobados en los conocidos como SHA-2 y SHA-3).

Estos sucesores tienen un rango de bytes más ámplio, lo que incrementa la dificultad de encontrar colisiones.

No obstante, mi opinión es que el infinito sigue siendo mayor, y que, a la larga, resumir siempre está expuesto a colisiones. Esto se puede "asegurar" de la siguiente manera:

Si no hubiesen colisiones, cada texto tendría un hash único. Esto significa que no haría falta saber el funcionamiento del hash, solamente deberíamos tener un "traductor".

Y es por eso que el hash no se usa solo... siempre va acompañado de otras cosas, como el "salt".

Espero que os haya gustado la entrada, en la próxima haremos un análisis de MD5.

Como siempre...

¡Hasta la próxima!