¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Funciones hash e integridad de los datos

Después de esta lección: Puedo usar un hash para comprobar que unos datos no han cambiado.

Lección de 50 min7 comandosLaboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

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

PalabraQué significaEjemplo
Hashla huella de longitud fija que sale de unos datos
Integridadla garantía de que los datos no han cambiado
Suma de comprobaciónun hash que acompaña a un archivo para verificarlosumas.txt
Efecto avalanchaun cambio mínimo en los datos cambia casi todo el hash
Colisióndos datos distintos con el mismo hash
SHA-256una 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

TextoPrimeros 16 caracteres del hashLargo total
holab221d9dbb083a7f364 caracteres
Holae633f4fc79badea164 caracteres
Pedido 2043: 120 EUR (con salto de línea)d451f79a4c6bc4c264 caracteres
Pedido 2043: 129 EUR (con salto de línea)2b4d78b8771a8cac64 caracteres

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Calcula el hash de hola

Comando
printf 'hola' | sha256sum

Se 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

Comando
printf 'Hola' | sha256sum

Se 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

Código: python
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

Comando
printf 'Pedido 2043: 120 EUR\n' > pedido.txt

Se 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

Comando
sha256sum pedido.txt > sumas.txt

Se 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

Comando
sha256sum -c sumas.txt

Se 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

Comando
printf 'x\n' >> pedido.txt

Se 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

Comando
sha256sum -c sumas.txt

Se 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.

Sobre este laboratorio y su código: Laboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.