Una huella para saber si algo ha cambiado
Una función hash convierte unos datos cualquiera en una huella corta y de longitud fija. Con esa huella puedes comprobar que un archivo no ha cambiado ni un solo bit.
Una tienda online recibe cada noche un archivo con los pedidos del día. Si alguien lo cambia por el camino, la tienda envía mercancía equivocada. Con un hash lo notas en un segundo.
Al final de esta lección
Nota
Puedo usar un hash para comprobar que unos datos no han cambiado.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Hash | la huella de longitud fija que sale de unos datos | |
| Integridad | la garantía de que los datos no han cambiado | |
| Suma de comprobación | un hash que acompaña a un archivo para verificarlo | sumas.txt |
| Efecto avalancha | un cambio mínimo en los datos cambia casi todo el hash | |
| Colisión | dos datos distintos con el mismo hash | |
| SHA-256 | una función hash actual, con huella de 256 bits |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un hash es la huella de unos datos
Un hash se calcula a partir de los bytes de unos datos. Los mismos datos dan siempre el mismo hash. Datos distintos dan, en la práctica, hashes distintos.
El hash de SHA-256 mide siempre 256 bits. Se escribe con 64 cifras hexadecimales, aunque los datos sean una palabra o una película.
Ejemplo: dos textos casi iguales
| Texto | Primeros 16 caracteres del hash | Largo total |
|---|---|---|
| hola | b221d9dbb083a7f3 | 64 caracteres |
| Hola | e633f4fc79badea1 | 64 caracteres |
| Pedido 2043: 120 EUR (con salto de línea) | d451f79a4c6bc4c2 | 64 caracteres |
| Pedido 2043: 129 EUR (con salto de línea) | 2b4d78b8771a8cac | 64 caracteres |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Calcula el hash de hola
printf 'hola' | sha256sumSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Calcula el hash de Hola
printf 'Hola' | sha256sumSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un cambio mínimo cambia casi todo el hash
Esto se llama efecto avalancha. Entre el hash de hola y el de Hola se diferencian 63 de los 64 caracteres.
Por eso no puedes arreglar un archivo para que conserve su hash. Cualquier retoque cambia la huella entera.
Cuenta los caracteres distintos
import hashlib
# Dos textos que se diferencian en una sola letra.
a = hashlib.sha256("hola".encode()).hexdigest()
b = hashlib.sha256("Hola".encode()).hexdigest()
distintos = 0
for i in range(len(a)):
if a[i] != b[i]:
distintos = distintos + 1
print("Caracteres distintos:", distintos, "de", len(a))
# Cambia "Hola" por "hola " (con un espacio al final) y pulsa Ejecutar.
Un error frecuente
Advertencia
Mucha gente cree que un hash es un cifrado y que se puede descifrar. No es así. Un hash no tiene clave y no guarda los datos: es solo una huella. No hay forma de recuperar el texto a partir de ella.
Comprobar un archivo con una lista de sumas
Quien publica un archivo publica también su hash. Quien lo descarga calcula el hash y compara.
Si coinciden, los bytes son los mismos. Si no coinciden, el archivo se dañó o alguien lo cambió. sha256sum -c hace esa comparación por ti con una lista de sumas.
Crea un archivo de pedido
printf 'Pedido 2043: 120 EUR\n' > pedido.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Guarda su suma en una lista
sha256sum pedido.txt > sumas.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Verifica el archivo contra la lista
sha256sum -c sumas.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Añade una línea al archivo
printf 'x\n' >> pedido.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Verifica otra vez
sha256sum -c sumas.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un hash no dice quién envió el archivo
Un hash prueba que los datos no han cambiado respecto a una huella. No prueba de quién es la huella.
Si un atacante cambia el archivo, también puede calcular y publicar un hash nuevo. La huella debe llegar por un camino de confianza. La lección 4 muestra cómo una firma resuelve esto.
MD5 y SHA-1 tienen colisiones conocidas. Para seguridad usa SHA-256 o mejor.
Para ir más lejos
Prueba con tus archivos. Crea dos archivos con printf que se diferencien en una sola cifra, por ejemplo 120 EUR y 129 EUR. Calcula el hash de cada uno con sha256sum.
Mira cuántos caracteres cambian. Antes de ejecutar, di si esperas pocos o muchos.