Supongamos que configura una cuenta en VerySecureWebsite.com. Escribes tu dirección de correo electrónico y contraseña y configuras tu cuenta. Poco tiempo después, recibe un correo electrónico que le informa que, irónicamente, el sitio web ha sido pirateado y los nombres de usuario y contraseñas de cada usuario, que se almacenaron en texto sin formato, ahora están a la venta en la web oscura. Mientras empiezas a cambiar la contraseña de todas tus cuentas (solo usas una, monstruo), te preguntas: “¿No es una mala idea? ¿No debería mi contraseña estar en algún tipo de código secreto para que los piratas informáticos no puedan simplemente leerla?
Estás en lo correcto. Cualquier aplicación o servicio web que use un sistema de inicio de sesión con nombre de usuario/contraseña debería almacenar las contraseñas de sus usuarios usando un hash salado, posiblemente incluso un hash lento salado, tal vez con pimienta. Si esto comienza a sonar más como un desayuno que como criptografía, no se preocupe: a diferencia de su contraseña (con suerte), el almacenamiento seguro de contraseñas no es un tema demasiado difícil de descifrar.
Texto sin formato y cifrado básico
Usuario involuntario | Contraseña debil | Contraseña debil |
Almacenar contraseñas de texto sin formato en una base de datos conectada a Internet es una idea bastante mala: si la base de datos es pirateada, cualquiera que haya reutilizado una de esas contraseñas ahora está en riesgo. Y todavía un número inquietante de sitios web todavía lo hacen, probablemente porque las actualizaciones de seguridad son más para el cliente que para la empresa. Si desea probar si un sitio está haciendo esto, intente seleccionar la opción «Olvidé mi contraseña». Si solo le envían su contraseña en lugar de un enlace de restablecimiento, se almacena en texto sin formato.
Usuario involuntario | Contraseña debil | 38MkoXVXoKe01uAOROBLpQ== |
El cifrado puede sonar como una forma sólida de almacenar contraseñas, pero en realidad es solo un paso por encima del texto sin formato. Una contraseña cifrada generalmente se puede decodificar con una clave, y si los piratas informáticos pueden encontrarla o adivinarla, el cifrado es inútil.
Hashing > cifrado
Usuario involuntario | Contraseña debil | Contraseña debil | 252E2406732308F9A7 B378ED94E78467D14 077D19C8282443FCD 3D6190FCABFA |
Una función hash es básicamente un cifrado unidireccional: convierte la contraseña de texto sin formato en un código secreto, pero no hay una clave para volver a convertirla, lo que significa que nunca puede derivar la contraseña real de la versión hash.
Así es como la mayoría de los sitios web seguros gestionan sus contraseñas:
- El usuario crea una cuenta
- La contraseña del usuario se ejecuta a través de la función hash y se almacena en la base de datos.
- Cada vez que el usuario inicia sesión, la base de datos procesa la contraseña que ingresó y verifica si el hash ingresado coincide con el hash que tienen en el archivo.
- En caso afirmativo, el usuario puede iniciar sesión
Con un hash, la aplicación/sitio nunca almacena su contraseña real en ninguna parte, y un pirata informático que ingresa solo obtendrá una lista de letras y números que no se pueden decodificar. Dependiendo de qué tan fuerte sea el algoritmo, estos hashes pueden ser bastante difíciles de descifrar.
Sin embargo, los hashes no son a prueba de hackers. Todo lo que un atacante tiene que hacer es ejecutar un diccionario de posibles contraseñas a través de la función hash, luego comparar esos hashes con los hashes en la base de datos. Cuando dos hashes coinciden, el hacker puede ver qué contraseña generó ese hash.
Para ahorrar tiempo y poder de cómputo, muchos atacantes simplemente usan una tabla de búsqueda (o una «tabla arcoíris», una versión de las tablas de búsqueda que ahorra espacio), una tabla pregenerada llena de posibles contraseñas y sus hash. en realidad puedes intentarlo hash de una palabra de texto sin formato y entonces use una tabla de búsqueda en el hash tú mismo; no es demasiado dificil Esencialmente, si su contraseña es común, el hash de esa contraseña probablemente ya esté en una tabla de búsqueda. Esta es una gran razón para no usar contraseñas comunes.
Hachís salado > hash
Usuario involuntario | Contraseña debil | XcyKn42Contraseña débil | 13EB660FF7FBD29A728FC5 92297D78DF19AFF8797363 15FBF1F1C4B7123BD10C |
A diferencia de las babosas, la sal fortalece el hachís. Dado que todo el hash cambia incluso si solo se cambia una letra de la palabra de texto sin formato, todo lo que un sitio debe hacer para frustrar las tablas de búsqueda es agregar algo de texto sin formato adicional a la contraseña antes de que se convierta en hash. El atacante podrá leer el salt de texto sin formato ya que está almacenado en la base de datos, pero lo obliga a volver a calcular todas las combinaciones posibles de posibles contraseñas y salts.
Por supuesto, los hashes salados aún se pueden descifrar. Los piratas informáticos pueden simplemente agregar sal a la contraseña que están adivinando, codificar la combinación y esperar a que aparezcan las coincidencias: un ataque de diccionario estándar. Dado que las GPU modernas pueden hacer miles de millones de conjeturas por segundo, esto no es del todo inviable, pero hace que el proceso sea mucho más molesto. En su defecto, los ataques de fuerza bruta son lentos pero muy efectivos.
Hacer hashes aún más fuertes: otras tácticas
Usuario involuntario | Contraseña debil | XcyKn42Contraseña débil | $2y$12$6OleutQBO2iPoNvg pyDndOU26Lqt9Y34f6PLEOx mCELP5GoswrJT. |
Los algoritmos de hashing lento, como PBKDF2 o bcrypt, utilizan una técnica conocida como «estiramiento de clave» para ralentizar los ataques de diccionario y de fuerza bruta. Básicamente, esto implica configurar la función hash para iterar una cierta cantidad de veces (aunque es un poco más complejo que simplemente ejecutar la misma cosa una y otra vez), de modo que para alcanzar el hash correcto tiene que usar mucha computación energía. Si un sitio está haciendo todo esto, su seguridad es bastante buena.
Usuario involuntario | Contraseña debil | XcyKn42Contraseña débil|4|\/|@p3pp3r | $2y$12$njmWr5UMydCzdCE44ElW/ OIfYp2PH9sgonCATyVY.OVKSpmoSaZlu |
Para mayor seguridad, también puede «sazonar» sus hashes, que con suerte ya están salados. Una pimienta, como una sal, es un conjunto de valores adjuntos a la contraseña antes de que se convierta en hash. Sin embargo, a diferencia de una sal, solo hay un valor de pimienta, y se mantiene en secreto, separado de las sales y los hachís. Agrega otra capa de seguridad al hash salado, pero si el atacante logra encontrarlo, ya no es muy útil ya que el atacante puede usarlo para calcular nuevas tablas de búsqueda.
No hagas un hash de tu hash
La seguridad de las contraseñas ha hecho grandes avances, al igual que el arte de descifrar esa seguridad. Desafortunadamente, los humanos todavía son malos en la administración de contraseñas y las bases de datos no actualizan la seguridad con la frecuencia que deberían. En general, suponga que cada vez que crea una cuenta, la contraseña se almacena con una seguridad relativamente débil. Si su contraseña es común o una palabra del diccionario, entonces corre un riesgo bastante alto de ser descifrada. Haga que sus contraseñas sean largas, mezcle letras, números y símbolos, y estará ayudando a las funciones hash a hacer su mejor trabajo.
Créditos de la imagen: Función hash