Que es un Hash?
Un Hash es una función que convierte una entrada (texto, letras y números, un archivo, codigo binario, etc.) en una salida encriptada de una longitud fija, el Digest. Un Hash se crea mediante un algoritmo y es esencial para la gestión de la blockchain en criptomonedas.
Un Hash además es una función que trabaja en una sola dirección, es decir, del texto de longitud variable hacia el Hash (resultado, digest) de longitud fija. El algoritmo no permite generar la entrada de texto desde un Digest. Por lo tanto, para crackear un texto, es decir, adivinar el texto a partir de un hash, la única forma de lograrlo es dar como entrada al algoritmo diferentes textos, hashearlos y comparar los Digest, y repetir la operacion hasta lograr encontrar el texto que genere el Digest esperado.
Los passwords en los sistemas de computo funcionan de esta forma. Por eso cuando algún hacker logra obtener la lista de hashes de los passwords de usuarios debe luego proceder a usar un diccionario o texto aleatorio y hashearlo, para luego compararlo contra la lista de usuarios y passwords hasheados que obtuvo. Si encuentra dos idénticos (el generado y el obtenido), entonces podrá tener acceso a esa cuenta. Esta es una de las razones de la importancia de tener passwords de una longitud mínima de 16 caracteres.
Otra característica de un hash es que un cambio mínimo en el texto de entrada cambia significativamente el resultado del Hash. El ejemplo de arriba utiliza la función hash sha1sum. Veamos ejemplos de sha256sum, que es el algoritmo que utiliza Bitcoin.
En comando Linux:
echo -n "El zorro rojo" | sha256sum
caf83e48551d03dfed27e2eecc023bc1c4a37d0836d24726d78fe62372d26da8 -
En Python:
import hashlib;
print (hashlib.sha256('El zorro rojo').hexdigest());
caf83e48551d03dfed27e2eecc023bc1c4a37d0836d24726d78fe62372d26da8
Ahora veamos como cambia si tan solo modificamos una letra:
import hashlib;
print (hashlib.sha256('El zorro rojo').hexdigest());
print (hashlib.sha256('El zorro Rojo').hexdigest());
caf83e48551d03dfed27e2eecc023bc1c4a37d0836d24726d78fe62372d26da8
18a3f0bd0b7a3a1acf5f3381095fd7467eacb26effc44478e339e6253b59b739
En teoría podemos tener dos Digest identicos con entradas diferentes, sin embargo esto es poco probable o casi imposible, dependiendo del Hash usado. En MD5 es por ejemplo mas probable de obtener Digest identicos que en SHA256, donde es en la práctica imposible.
Resumen
- Un Hash es una función que convierte una entrada en una salida encriptada de una longitud fija (Digest).
- Hashear solo funciona en una dirección.
- Cambios mínimos en la entrada generan cambios significativos en el Digest.
- Es casi imposible obtener dos Digest iguales con entradas diferentes (aunque depende de la función Hash utilizada).
- Las Blockchain de las criptomonedas utilizan Hashes para darle seguridad a toda la cadena y también para generar las direcciones públicas.
Referencias
- https://en.wikipedia.org/wiki/Cryptographic_hash_function
- https://www.investopedia.com/terms/h/hash.asp
- https://www.baeldung.com/linux/sha-256-from-command-line
- https://www.computerhope.com/unix/sha256sum.htm
- https://stackoverflow.com/questions/13757779/discrepancy-between-sha256sum-executable-and-pycrypto-library