Café y Código

4. Hashes y Contraseñas: Asegurando Credenciales 🔑🛡️

¿Qué es una Función Hash?

Una función hash toma una entrada de cualquier longitud y la transforma matemáticamente en una cadena de caracteres de tamaño fijo. Las funciones hash criptográficas cumplen tres propiedades esenciales:

  • Unidireccionalidad (Irreversible): Si tienes el hash, es computacionalmente imposible revertirlo para obtener el texto original.
  • Determinismo: La misma entrada exacta siempre producirá exactamente el mismo hash de salida.
  • Efecto Avalancha: Si modificas un solo carácter o bit en la entrada, el hash resultante cambia por completo de forma irreconocible.

❌ Nunca uses SHA-256 para guardar contraseñas

Aunque SHA-256 es seguro para verificar la integridad de un archivo descargado, es inseguro para almacenar contraseñas. SHA-256 es un algoritmo diseñado para ser extremadamente rápido. Un atacante con una GPU moderna de escritorio puede probar miles de millones de hashes de SHA-256 por segundo, descifrando contraseñas comunes en minutos mediante ataques de fuerza bruta.

El poder de la Sal (Salt) y los algoritmos lentos

Para proteger contraseñas, usamos algoritmos de Derivación de Clave (KDF) deliberadamente lentos y costosos en CPU/Memoria como Argon2id, bcrypt o scrypt. Estos algoritmos añaden automáticamente una sal (un string de caracteres aleatorios único para cada usuario) antes de procesar el hash.

La sal previene que dos usuarios con la misma contraseña tengan el mismo hash en la base de datos, y neutraliza por completo los ataques basados en Tablas Arcoíris (bases de datos con hashes precalculados de millones de contraseñas comunes).

Implementación en Código

Compara el hashing general (SHA-256) versus el hashing de contraseñas mediante algoritmos ralentizados seguros en los cuatro lenguajes.

Hashing de Datos y Contraseñas
PYTHON
1 import hashlib
2 import os
3
4 # 1. Hashing de datos general (SHA-256)
5 datos = b"Verificar integridad de datos"
6 sha256_hash = hashlib.sha256(datos).hexdigest()
7 print(f"SHA-256: {sha256_hash}")
8
9 # 2. Hashing seguro de contrasenas usando PBKDF2 (incluido en hashlib)
10 password = "MiPasswordSeguro123".encode('utf-8')
11 sal = os.urandom(16) # Sal aleatoria de 16 bytes
12 # Generar hash con 100,000 iteraciones
13 password_hash = hashlib.pbkdf2_hmac('sha256', password, sal, 100000)
14 print(f"Hash derivado (hex): {password_hash.hex()}")

Ponte a prueba

Comprueba tus conocimientos sobre salts y almacenamiento seguro de contraseñas.

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.