Saltar al contenido principal

Seguridad informática: algoritmo SHA256

· 12 min de lectura
Oscar Adrian Ortiz Bustos

Introducción

En el mundo actual de la informática, la seguridad de nuestros datos y la integridad de la información que compartimos en línea se han convertido en aspectos fundamentales de nuestras vidas digitales. Aunque a menudo pasan desapercibidos, existen poderosos guardianes cuyo trabajo esencial es mantener a salvo nuestros secretos más preciados (como contraseñas, números de tarjetas de crédito, etc.) y garantizar que los datos que compartimos en línea no se hayan alterado, uno de estos guardianes es el algoritmo SHA256.

Este algoritmo, que puede sonar como algo lejano y técnico, está mucho más presente en nuestro día a día de lo que podríamos imaginar. Ya sea que estemos enviando mensajes cifrados, realizando transacciones bancarias en línea o simplemente navegando por la web, este algoritmo trabaja incansablemente en segundo plano para asegurarse de que nuestros datos permanezcan intactos y fuera del alcance de personas no autorizadas.

¿Qué es el algoritmo SHA256?

Para intentar comprender la importancia y la relevancia del algoritmo SHA256 en el mundo de la seguridad informática, primero debemos desentrañar que es exactamente este enigmático acrónimo. SHA256 se deriva de las palabras "Secure Hash Algorithm 256 bits", lo que significa que es un algoritmo de hash seguro de 256 bits. A primera vista, puede sonar como una jerga técnica y aburrida (y sinceramente lo es) pero en realidad es un componente crítico en la protección de datos en línea.

Usando palabras más coloquiales, este algoritmo es como el guardián de la integridad de los datos. Su tarea principal es tomar una cantidad arbitraria de información, ya sea un mensaje de texto, una contraseña o incluso un archivo completo, y convertirla en una secuencia de 256 bits, un conjunto de números y letras aparentemente aleatorios. Esta secuencia conocida como "hash", es única para cada conjunto de datos que se le pasa al algoritmo, lo que significa que si se cambia una sola letra en el mensaje original, el hash resultante será completamente diferente. Es como la "huella digital" de los datos, y es imposible que dos conjuntos de datos diferentes produzcan el mismo hash.

¿Cómo funciona el algoritmo SHA256?

Ahora que ya tenemos un poco más de contexto general sobre lo que es este algoritmo, es hora de profundizar un poco más en cómo funciona. Como se mencionó anteriormente, el algoritmo SHA256 toma una cantidad arbitraria de datos y los convierte en una secuencia de 256 bits. Pero, ¿cómo lo hace exactamente? ¿Cómo puede tomar cualquier cantidad de datos y producir un hash único para cada uno de ellos?

Mensaje M

El mensaje "M" o "datos de entrada" es la información que la función SHA256 procesará para calcular el hash (también conocido como "digest"). M puede tener una longitud variable, lo que significa que puede consistir en un archivo de datos o una cadena de texto, como por ejemplo "Hola mundo", incluso puede ser una cadena de texto vacía.

El resultado de este proceso es una cadena ω de 256 bits de longitud, que se expresa en un formato de 64 caracteres hexadecimales(base16). Este proceso de transformación garantiza que, independientemente de la forma o contenido de la entrada, obtendremos un hash de 2556 bits que actúa como una huella digital única de los datos de entrada.

La función SHA256 se puede representar como SHA256(M) = ω, donde M es el mensaje de entrada y ω es el hash de salida.

Función SHA256

Aplicando esa función a una cadena de texto como "Hola mundo" obtendríamos el siguiente resultado:

echo -n "Hola mundo" | sha256sum
ca8f60b2cc7f05837d98b208b57fb6481553fc5f1219d59618fd025002a66f5c

La cadena hexadecimal generada se obtiene mediante una serie de cálculos en los que se emplean entre otros datos los bits de entrada, es decir, para un mismo mensaje M siempre se obtendrá el mismo hash ω. Por el contrario, si modifica un solo bit, ya sea cambiando o agregando un caracter (espacios y saltos de línea incluidos), el hash resultante será completamente diferente.

echo -n "abc" | sha256sum
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
echo -n "Abc" | sha256sum
06d90109c8cce34ec0c776950465421e176f08b831a938b3c6e76cb7bee8790b

De este modo, se garantiza la integridad de los datos. Si alguien modifica el mensaje, el hash resultante será diferente, por lo que no coincidirá con el hash original. Esto permite detectar si los datos han sido modificados.

Conversión a hexadecimal

Para poder procesar el mensaje M se debe de realizar en primer lugar una conversión a formato hexadecimal de la misma. Aquí se sustituye cada caracter ASCII por su número hexadecimal correspondiente. Por ejemplo, el caracter a se sustituye por 61 y el caracter b por 62. El resultado de esta conversión se representa como M_hex.

Conversión a hexadecimal

Uniendo cada código hexadecimal correspondiente a cada caracter se obtiene la conversión del mensaje M a hexadecimal o base 16. Una vez que se obtiene el mensaje en formato hexadecimal se reserva el resultado a parte para utilizarlo más adelante en otras funciones.

Cálculo de la longitud de M

Durante el proceso para encontrar el digest o hash, será necesario calcular la longitud del mensaje de entrada |M|. Esta longitud se expresa en bits y se representa como un número binario de 64 bits. Por ejemplo, si el mensaje de entrada M tiene una longitud de 8 bits, la longitud de M se representará como 0000000000001000.

MBits x CaracterDecimalHexadecimalLongitud
Hola mundo8 x 108050M16 = 50
abc8 x 32418M16 = 18
La cueva del NeanderTech8 x 23184B8M16 = B8

Construcción de la variable Wt

La variable Wt es un vector de 64 palabras de 32 bits cada una. Tiene un tamaño o longitud de 2048 bits (256 bytes) y se obtiene mediante la siguiente función recursiva definida por intervalos.

Construcción de la variable Wt

El primer intervalo es el que abarca los primeros 16 registros, o sea desde W0 hasta W15. El segundo intervalo es el esquema de los 48 registros restantes, es decir, desde W16 hasta W65. Ambos tienen sus propias reglas de construcción.

La representación gráfica de la función Wt se puede ver en la siguiente imagen:

Construcción de la variable Wt

Sha256algorithm.com

En la página web sha256algorithm.com podemos ver una implementación de este algoritmo en Javascript. En la página se puede ver el código fuente completo del algoritmo, así como una explicación detallada de cada una de las funciones que lo componen. También se puede probar el algoritmo con diferentes mensajes y ver el resultado de cada una de las funciones.

Lo impresionante de este algoritmo es que, a pesar de su complejidad, se puede implementar en un lenguaje de programación como Javascript, que es un lenguaje interpretado y no compilado. Esto significa que el código Javascript se ejecuta directamente en el navegador del usuario, sin necesidad de compilarlo previamente. Esto es posible gracias a la potencia de los navegadores modernos, que pueden ejecutar código Javascript a una velocidad comparable a la de los lenguajes compilados como C++ o Java.

Este sitio te proporciona una representación visual en tiempo real del proceso de cálculo de SHA-256 a medida que se ingresa un mensaje de entrada. Los usuarios pueden ver como cada paso transforma los datos y finalmente genera el hash resultante. Esto es útil si quieres comprender la mecánica detrás del algoritmo.

Aplicación del algoritmo SHA256

  1. Protección de contraseñas: El algoritmo SHA256 se utiliza para proteger las contraseñas de los usuarios. Cuando un usuario crea una cuenta en un sitio web, la contraseña se convierte en un hash SHA256 y se almacena en la base de datos del sitio web. Cuando el usuario inicia sesión en el sitio web, la contraseña que ingresa se convierte en un hash SHA256 y se compara con el hash almacenado en la base de datos. Si los dos hashes coinciden, entonces el usuario ha ingresado la contraseña correcta.
  2. Verificación de integridad de archivos: Se puede utilizar para verificar la integridad de los archivos. Cuando se descarga un archivo de Internet, se puede verificar la integridad del archivo descargado comparando el hash del archivo descargado con el hash proporcionado por el sitio web. Si los dos hashes coinciden, entonces el archivo descargado es idéntico al original, lo que significa que no se ha modificado durante el proceso de descarga.
  3. Blockchain: La tecnología blockchain, que sustenta las criptomonedas como Bitcoin, utiliza SHA-256 en su proceso de minería y en la creación de firmas digitales. Cada bloque en una cadena de bloques contiene un hash del bloque anterior, lo que garantiza la inmutabilidad y la secuencia de los datos. Ademas, SHA-256 se utiliza para crear firmar digitales que verifican las transacciones en la red blockchain,asegurando que solo las partes autorizadas puedan realizar transferencias de fondos.
  4. Seguridad en mensajes y comunicaciones: Un ejemplo es la creación de huellas digitales de correos electrónicos o mensajes, que permiten a los receptores verificar que el mensaje no ha sido alterado durante la transmisión. También se utiliza en la generación de claves de sesión para la comunicación segura, como en el protocolo TLS/SSL utilizado en conexiones HTTPS.

Ejemplo de aplicación

A modo de que quede un poco más claro el funcionamiento de este algoritmo en un caso práctico, vamos a ver un ejemplo de cómo se aplica el algoritmo SHA256 a un mensaje de entrada. Para ello, vamos a ir a la página de descarga de Graphviz que utilicé hace poco para hacer un mapa conceptual.

Nos mostrara una página como la siguiente:

Página de descarga de Graphviz

Podemos ver que están los links de descarga pero a su derecha nos muestra un hash SHA256. Este hash es el resultado de aplicar el algoritmo SHA256 al archivo que se va a descargar. De este modo, si alguien modifica el archivo, el hash resultante será diferente, por lo que no coincidirá con el hash original. Esto permite detectar si los datos han sido modificados.

Descargamos ambos archivos. El archivo graphviz-9.0.0 (32-bit) ZIP archive y el archivo graphviz-9.0.0 (32-bit) ZIP archive.sha256. Este último contiene el hash SHA256 del archivo que se va a descargar.

Descarga de Graphviz

Existen herramientas en línea que permiten calcular el hash SHA256 de un archivo. Pero en La Cueva del NeanderTech vamos a hacerlo de forma manual. Para ello, vamos a utilizar la herramienta sha256sum que viene instalada por defecto en las distribuciones Linux.

Lo podemos hacer de dos maneras, la primera es ejecutando el comando sha256sum y pasándole como parámetro el archivo que queremos calcular el hash, anotar ese hash y posteriormente hacerle un cat al archivo graphviz-9.0.0 (32-bit) ZIP archive.sha256 y comprobar que coinciden.

O lo podemos hacer de la forma divertida, que es hacer un script en Bash que nos calcule el hash SHA256 de un archivo y lo compare con el hash que viene en el archivo .sha256. Cree uno simple llamado Hashify:

#!/bin/bash

# Este script comprueba que el hash Sha256 de un archivo concida con el hash de referencia
# Tiene dos parámetros: el nombre del archivo y el hash de referencia
#Author: 4DRIAN0RTIZ
#Fecha: 09/09/2023

# Ejemplo de uso: ./hashify.sh <archivo> <hash>

# Colores para los mensajes de salida
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
PURPLE='\033[0;35m'
BROWN='\033[0;33m'
BLUE='\033[0;34m'
END_COLOR='\033[0m'

# Declaración de variables
sha_archivo=$(sha256sum $1 | awk '{print $1}')
sha_referencia=$(awk '{print $1}' $2)

# Comprueba que el número de parámetros es correcto

if [ $# -ne 2 ]; then
echo -e "${RED}Error: Número de parámetros incorrecto${END_COLOR}"
echo -e "${YELLOW}Uso: ./hashify.sh <archivo> <hash>${END_COLOR}"
exit 1
fi

# Comprueba que el archivo existe

if [ ! -f $1 ]; then
echo -e "${RED}Error: El archivo $1 no existe${END_COLOR}"
exit 1
fi
# Comprueba que el hash de referencia existe
if [ ! -f $2 ]; then
echo -e "${RED}Error: El archivo $2 no existe${END_COLOR}"
exit 1
fi

# Comprueba que el hash Sha256 del archivo coincide con el hash de referencia
if [ $sha_archivo == $sha_referencia ]; then
echo -e "${GREEN}El hash del archivo $1 coincide con el hash de referencia${END_COLOR}"
else
echo -e "${RED}El hash del archivo $1 no coincide con el hash de referencia${END_COLOR}"
echo -e "${YELLOW}Hash del archivo: $sha_archivo${END_COLOR}"
echo -e "${YELLOW}Hash de referencia: $sha_referencia${END_COLOR}"
fi

exit 0

Script Hashify

Para ejecutarlo usamos el comando ./hashify.sh <archivo> <hash>. En nuestro caso, el archivo es windows_10_msbuild_Release_graphviz-9.0.0-win32.zip y el hash es windows_10_msbuild_Release_graphviz-9.0.0-win32.zip.sha256. El resultado es el siguiente:

Ejecución de Hashify

Conclusión

Como hemos visto, el algoritmo SHA256 desempeña un papel esencial en la seguridad informática, protegiendo la integridad de los datos en una amplia variedad de contextos, desde la salvaguarda de contraseñas hasta la verificación de archivos y su función crítica en la tecnología blockchain. A pesar de su complejidad aparente, SHA256 se presenta como un guardián discreto pero poderoso de nuestros datos en línea, generando huellas digitales únicas para cada conjunto de información. Desde la Cueva del NeanderTech esperamos que este artículo haya sido de su agrado y les haya servido para conocer un poco más sobre este algoritmo, los invito a que lo implementen en sus proyectos y a que me dejen sus comentarios y sugerencias.

La criptografía es el componente esencial de la independencia de las organizaciones en Internet, igual que los ejércitos son los componentes esenciales de los Estados, porque de lo contrario un Estado se apodera de otro sin más.

— Whitfield Diffie.

Referencias

Descriptions of SHA-256, SHA-384, and SHA-512

Pagefreezer