El tema de esta entrada viene dada por una curiosa conversación que se dio en un grupo de whatsapp y he decidido escribir al respecto para, también yo, aprender mas. No pretendo entregar un arsenal de herramientas que nos sirvan para este labor, quiero ver el trasfondo del tema, como lo hacen los programas para identificar si un hash pertenece a uno u otro algoritmo de cifrado.Para esto debemos fijarnos en como esta construido nuestro hash, datos como la cantidad de caracteres, si esta utilizando solo minúsculas, si esta utilizando solo mayúsculas, si las mezcla, si tiene números, si es alfanumérico (números y letras) y la fuente, si tiene símbolos son relevantes en esta labor.
Empezaremos por la longitud.
Cada hash genera una cantidad fija de bytes en la salida (por eso es que existen vulnerabilidades como colisiones en los hash)
Hay que tener cuidado de no confundir la cantidad de bytes a la salida con los caracteres que vemos
Veamos este punto con un ejemplo de MD5 (por cierto hace años que se considera este algoritmo roto)
para la palabra «hola» tendremos una salida de 32 caracteres como esta
4d186321c1a7f0f354b297e8914ab240
Sin embargo en el RFC (Request For Comment) nos dice que la salida produce una longitud fija de 128-bits
¿que pasa con los 96 bit que faltan?
La realidad es que están ahí, sin embargo el hash suele expresarse de forma hexadecimal así que tenemos que transformarlo a binario, para eso podemos usar esta pagina. En este caso la salida binaria nos da
01001101000110000110001100100001110000011010011111110000111100110101010010110010100101111110100010010001010010101011001001000000
Como ven la salida aumenta considerablemente de tamaño y caracteres (que al ser binario es solo 1 y 0) y ahi tenemos los 128 bits que no veíamos al principio.
Un método más rápido para saber la longitud en bits de una salida en hexadecimal es multiplicando por 4 la salida, les explico
un carácter hexadecimal equivale a 4 dígitos binarios (lo pueden comprobar en la página) por lo tanto si tenemos 32 caracteres
32×4=128
Una cosa que descubrí realizando este post es que en el caso de MD5, la salida no ocupa todas las letras que permite hexadecimal (A-F), sino que solo las primeras 4 (A-D)
Continuando con los caracteres.
También nos sirve para identificar un hash pero esta característica la encuentro un poco ineficiente ya que la mayoría de los hashes se escriben en hexadecimal y hay pocas diferencias entre ellas, pero no significa que no las haya.
Podemos utilizar el mismo ejemplo anterior en MD5 y MD2
46a9a76ff97f13b4b158041c63f85f5f
4d186321c1a7f0f354b297e8914ab240
Ambos tienen 128-bits o 32 caracteres (que nos los engañe la vista, son 32) ¿como los diferenciamos?
Como les comente cuando hablábamos de la longitud descubrí que MD5 utiliza solo las letras de la A a la D, y en este caso ese mismo dato nos sirve para identificar cual es MD5 y cual es MD2.
En esta parte son muy sutiles las diferencias y hay que fijarse en que letras utiliza y cuales no.
La fuente
Para finalizar algo que nos puede servir de mucha ayuda (mucha en verdad) es la fuente desde donde obtuvimos el hash ya que, por lo general en la documentación de la fuente se indica el algoritmo que se utiliza y como se utiliza.
Con esto finalizo mi entrada del día de hoy, creo que de aquí podría continuar con la explicación de lo que es un RFC, las diferencias entre un hash, cifado y un «encodeo»
para finalizar les dejo una página que puede ser útil si desean ver mas cosas sobre los hash la cual con una palabra dada te entrega una serie de hashes http://www.sinfocol.org/herramientas/hashes.php
y ya que la parte «teórica» esta explicada una herramienta que nos permite identificar un hash llamada hash-id, esta escrita en python por lo que pueden revisar el código y ver su funcionamiento.