Password hashing es un aspecto fundamental para la seguridad de las contraseñas, transformando el panorama del almacenamiento de contraseñas de texto plano a hashes cifrados. Este artículo explora la evolución del hashing de contraseñas, desde los primeros algoritmos como MD5 y SHA-1 hasta los métodos más seguros que se recomiendan hoy en día, concluyendo con la importancia de usar contraseñas aleatorias para cada sitio web.
Antes de profundizar en la historia y evolución del hashing de contraseñas, es importante entender qué es el hashing. Las funciones hash, los métodos que realizan el hashing, están diseñadas para tomar cualquier cadena de datos, o "entrada", y producir una cadena de bytes de tamaño fijo, típicamente conocida como un "hash". Este proceso tiene varias características clave que lo hacen particularmente útil para fines de seguridad.
Una característica crucial de las funciones hash es su sensibilidad a los cambios en la entrada. Esto se conoce como el efecto avalancha. Incluso una alteración menor en la entrada, como cambiar un solo carácter en una contraseña, producirá un hash completamente diferente. Por ejemplo, los hashes para las cadenas "password1" y "password2" se verán completamente diferentes, aunque la única diferencia entre las dos entradas sea el último carácter. Esta característica es vital para mantener la integridad de los datos, ya que hace casi imposible inferir la entrada original solo a partir del hash.
Además, las funciones hash son funciones unidireccionales. Esto significa que están diseñadas para ser computacionalmente inviables de revertir. La salida (el hash) no retiene detalles específicos sobre la entrada que permitirían a alguien reconstruir los datos originales sin un esfuerzo computacional extraordinario. La única forma factible de "revertir" un hash es a través de un método llamado fuerza bruta, donde cada posible combinación de los datos originales se hashea nuevamente hasta encontrar un hash coincidente.
En los primeros días de la seguridad digital, MD5 (Algoritmo de Resumen de Mensaje 5) y SHA-1 (Algoritmo de Hash Seguro 1) eran ampliamente utilizados para el hashing de contraseñas. Desarrollados a principios de los años 90, estos algoritmos convertían las contraseñas en texto plano en valores hash de tamaño fijo. A pesar de su seguridad inicial, vulnerabilidades como la susceptibilidad a ataques de colisión pronto los volvieron obsoletos para aplicaciones seguras.
Si bien las funciones hash están diseñadas para ser rápidas y eficientes, esta característica puede ser perjudicial en lo que respecta a la seguridad de contraseñas, ya que facilita los ataques de fuerza bruta. Las Funciones de Derivación de Claves Basadas en Contraseñas (PBKDFs), como PBKDF2, bcrypt y scrypt, están diseñadas para contrarrestar estos ataques incorporando una sal (para defenderse contra ataques de tablas arco iris) y empleando una técnica conocida como estiramiento de clave. El estiramiento de clave ralentiza intencionalmente el proceso de hashing, lo que puede disuadir significativamente los intentos de acceso no autorizado.
A medida que avanzaba la ciberseguridad, las deficiencias de los primeros algoritmos de hashing como MD5 y SHA-1 se hicieron evidentes, lo que impulsó el desarrollo de algoritmos diseñados específicamente para la seguridad de contraseñas, como bcrypt, scrypt y Argon2, también conocidos como Funciones de Derivación de Claves Basadas en Contraseñas (PBKDFs).
Según OWASP, los algoritmos recomendados para el hashing de contraseñas son bcrypt, scrypt y Argon2. Estos se prefieren por su robusta defensa contra ataques de fuerza bruta y sus mecanismos integrados para la sal y el estiramiento de clave.
bcrypt es una función de hashing de contraseñas derivada del cifrado Blowfish. Incorpora una sal para protegerse contra ataques de tablas arco iris y utiliza un parámetro de costo para aumentar el tiempo de computación (y por lo tanto la dificultad) de generar el hash. Este factor de costo es ajustable, permitiendo que el algoritmo se escale con las mejoras del hardware.
Parámetros clave:
OWASP recomienda usar un factor de trabajo de 10 o más con un límite de contraseña de 72 bytes.
scrypt está diseñado para ser tanto intensivo en memoria como en tiempo para resistir ataques a gran escala con hardware personalizado. Puede configurarse para requerir una cantidad específica de memoria, e incluye una sal y un recuento de iteraciones, similar a PBKDF2.
Parámetros clave:
OWASP recomienda usar un parámetro mínimo de costo de CPU/memoria de (2^17), un tamaño de bloque mínimo de 8 (1024 bytes) y un parámetro de paralelización de 1.
Argon2, el ganador de la Competición de Hashing de Contraseñas en 2015, viene en dos variantes: Argon2d y Argon2i. Argon2d está optimizado para entornos donde la amenaza de ataques de canal lateral es baja, mientras que Argon2i está optimizado para resistir ataques de canal lateral. También incorpora características clave tanto de bcrypt como de scrypt.
Parámetros clave:
OWASP recomienda usar Argon2id con una configuración mínima de 19 MiB de memoria, un recuento de iteración de 2 y 1 grado de paralelismo.
Dada la naturaleza en evolución de las amenazas y contramedidas de seguridad, es crucial mantenerse actualizado con las prácticas más recientes en la seguridad de contraseñas. Para las recomendaciones más actuales y completas, consulte la Guía de Almacenamiento de Contraseñas de OWASP en el sitio oficial de OWASP. Asegúrese de revisar estas pautas regularmente para alinearse con las mejores prácticas en ciberseguridad.
Si bien es crucial emplear algoritmos de hashing modernos, la forma en que se crean y gestionan las contraseñas también juega un papel crítico en mantener la seguridad. Las contraseñas aleatorias para cada sitio web son esenciales debido a varios factores:
Desde MD5 y SHA-1 hasta algoritmos modernos como bcrypt y Argon2, el hashing de contraseñas ha pasado por transformaciones significativas. A medida que las amenazas cibernéticas continúan evolucionando, adoptar algoritmos de hashing modernos y asegurar el uso de contraseñas aleatorias y únicas para cada sitio web son prácticas esenciales para salvaguardar la seguridad en línea. Estas estrategias no solo previenen el compromiso de cuentas individuales, sino que también fortalecen la postura de seguridad general contra ataques cada vez más sofisticados.