In this article
9 prácticas recomendadas para almacenar contraseñas
Almacenar contraseñas de forma segura es un desafío para todas las organizaciones, desde pequeñas startups hasta grandes corporaciones.
En las startups recién fundadas, la falta de recursos puede llevar a contratar inicialmente a desarrolladores principiantes que no tienen conocimientos profundos sobre el almacenamiento adecuado de contraseñas. Como la autenticación se agrega bastante al principio del proceso de desarrollo, esto puede dar lugar a malas prácticas de almacenamiento de contraseñas.
Esto da lugar a implementaciones deficientes que se convierten en la base de la aplicación. Y, por supuesto, cuanto más central es un módulo para una aplicación, menos dispuesto estará el desarrollador a cambiarlo más adelante durante el proyecto, por temor a que deje de funcionar.
Así, la implementación deficiente de la autenticación se mantiene hasta que las cosas finalmente salen mal y alguien logra robar las contraseñas de tus usuarios.
Las prácticas recomendadas de seguridad de aplicaciones son fundamentales durante la etapa de desarrollo para prevenir las brechas en los sistemas desde el principio. Sin embargo, nada es 100 % seguro, así que debes tomar medidas para proteger las contraseñas de tus usuarios.
En este artículo, repasaremos las prácticas más importantes para almacenar contraseñas.
1. Protege tus bases de datos y contenedores
La seguridad de las bases de datos no es estrictamente una práctica recomendada para las contraseñas. Más bien, se aplica a todos los datos que almacenas en tu base de datos y, por eso, no debes pasarla por alto.
Si un atacante no puede acceder a tus datos desde el principio, tampoco tendrá la oportunidad de descifrarlos. Así que asegúrate de consultar también las prácticas recomendadas de seguridad de tu proveedor de bases de datos.
Por supuesto, esto se aplica a todos tus sistemas, no solo a tus bases de datos. Si usas un motor de contenedores popular como Docker, estás expuesto a todos los problemas que conlleva. Así que no descuides la seguridad de los contenedores y asegúrate de monitorear tus sistemas según sea necesario.
Seguridad de contenedores centrada en los desarrolladores
Snyk encuentra y corrige automáticamente vulnerabilidades en imágenes de contenedores y cargas de trabajo de Kubernetes.
2. Aplica hash a todas las contraseñas
Nunca almacenes contraseñas en texto sin formato. Siempre genera un hash a partir de ellas y almacena el hash. Para almacenar contraseñas, el hash es superior al cifrado, ya que no se puede revertir.
Cuando un usuario intente iniciar sesión, puedes volver a generar el hash a partir de la contraseña que ingresó y comprobar si coincide con el que guardaste cuando se registró. Nadie con acceso a la base de datos podrá leer ni adivinar la contraseña original a partir de ese hash, ni siquiera tú ni tus compañeros de trabajo. Además, usar un hash significa que no hay una clave de cifrado que puedan robar.
3. Usa una función hash segura
No todas las funciones hash son iguales. Algunas no son criptográficamente seguras y otras están diseñadas para calcularse rápidamente, algo que debes evitar al aplicar hash a una contraseña.
Las funciones hash que se calculan rápidamente permiten que los atacantes prueben por fuerza bruta muchas cadenas aleatorias hasta encontrar las contraseñas ocultas en los hashes. Debes hacer que les cueste. Aunque tendrás que usar esas funciones lentas al aplicar hash a una contraseña durante el registro o el inicio de sesión, no tendrás que usarlas con millones de cadenas aleatorias.
OWASP recomienda usar Argon2 para aplicar hash a las contraseñas. Si no está disponible, usa bcrypt; y si bcrypt tampoco está disponible, usa scrypt.
4. Agrega salt a tus contraseñas
Agregar salt a una contraseña consiste en agregarle una cadena aleatoria antes de aplicar hash. Así, los hashes resultantes de contraseñas conocidas no serán iguales. Un atacante podría tener una tabla con estas contraseñas y sus hashes correspondientes, y simplemente revisarla para ver cuáles usan tus usuarios. Esa tabla podría incluir el hash de la contraseña password, pero no el de &()/&IJDNSBAEpassword.
Además, los usuarios suelen reutilizar la misma contraseña en varias aplicaciones. Si un atacante accede a contraseñas filtradas de varias aplicaciones populares, agregarles salt antes de aplicarles hash evitará que pueda compararlas.
La cadena salt se almacena junto a la contraseña en la base de datos. Las bibliotecas modernas para generar hashes, como Argon2 o bcrypt, agregan salt automáticamente a las contraseñas antes de aplicarles hash.
5. Agrega pepper a tus contraseñas
Agregar pepper a tus contraseñas funciona igual que agregar salt: añades una cadena aleatoria antes de aplicar hash.
La diferencia es que, al agregar pepper, la cadena es la misma para todas las contraseñas, pero no se almacena junto a ellas en la base de datos. En cambio, debes guardarla en el sistema de archivos o en un almacenamiento de objetos. Cualquier lugar sirve, siempre que no sea el mismo donde está la base de datos de contraseñas.
Si un hacker logra acceder a tu base de datos, todavía le faltará un dato, por lo que será mucho más difícil relacionar tus hashes de contraseñas con las contraseñas correctas.
6. Actualiza tus factores de trabajo
Aunque las funciones hash tardan un tiempo en realizar su trabajo, a medida que aumenta la velocidad de procesamiento de las computadoras, el proceso también se acelera. Una operación para generar un hash que pudo haber tardado unos segundos cuando se escribió el código quizá solo le tome unos milisegundos a un atacante con una computadora más potente.
Para resolver este problema, las funciones hash tienen un parámetro llamado «factor de trabajo». Este factor hace que la función realice más iteraciones en el hash y, por lo tanto, tarde más.
Hay dos aspectos que considerar con los factores de trabajo. Por un lado, no quieres que aplicar hash sea demasiado fácil para un atacante; por otro, tampoco quieres que iniciar sesión sea demasiado difícil. Por lo general, conviene evitar elegir factores de trabajo extremadamente altos.
Si actualizas tu infraestructura y tus servidores alcanzan un mejor rendimiento, también debes actualizar tus factores de trabajo para que tu seguridad se beneficie de esa mejora.
7. No obligues a los usuarios a restablecer sus contraseñas
Antes se consideraba una práctica recomendada obligar a los usuarios a cambiar sus contraseñas cada pocas semanas. La idea era poner una fecha de vencimiento a las contraseñas robadas. Sin embargo, en la práctica esto solo frustraba a los usuarios y los llevaba a elegir contraseñas más simples y menos seguras.
Si debes seguir esta práctica obsoleta por requisitos de cumplimiento, no podrás evitarlo. Pero, si ningún factor externo te exige seguir esas pautas, no obligues a tus usuarios a cambiar sus contraseñas. A largo plazo, esto mejorará la calidad de las contraseñas.
8. Comprueba la longitud de las contraseñas, no su complejidad
En general, la longitud de una contraseña es más importante que su complejidad. Cuanto más larga sea, más tiempo de procesamiento se necesita para descifrarla mediante programación (en algunos casos, años). Esto puede ser conveniente, porque a un usuario le resulta mucho más fácil recordar IonceateahamburgerinLondon que x5§.11#.
Por eso, no debes exigir que los usuarios usen números o caracteres especiales. Simplemente deja que escriban lo que quieran y asegúrate de que tenga más de cinco caracteres.
9. Compara las contraseñas con diccionarios y listas de bloqueo
Aunque no debes exigir que los usuarios usen contraseñas complejas al azar, se recomienda comparar las contraseñas nuevas con las más conocidas en diccionarios públicos y listas de bloqueo. Si una contraseña nueva coincide con el contenido de estas fuentes, informa al usuario y asegúrate de que no la use.
Los hackers también usan estas fuentes de contraseñas para compararlas con los hashes que roban. Por lo tanto, comprobar las contraseñas con estas listas hará que les resulte aún más difícil descubrirlas en texto sin formato.
Las prácticas recomendadas para almacenar contraseñas son una parte fundamental del SDLC
Las contraseñas son una parte esencial de tu aplicación. Almacenarlas correctamente importa a largo plazo. Según la importancia de los datos de los usuarios, almacenar una contraseña vulnerada puede hacer caer a toda tu empresa.
Las malas prácticas con las contraseñas pueden causar muchos problemas de seguridad: pueden facilitar los ataques externos e internos, y también dejarte expuesto a contraseñas reutilizadas de otras aplicaciones. Si los usuarios cumplen menos con las políticas, esto puede generar frustración y reducir aún más su cumplimiento, lo que aumenta los riesgos de seguridad. Peor aún, podría disuadir a las personas de usar tu servicio.
Al crear software crítico, debes aplicar las prácticas recomendadas de seguridad en todas las capas del proceso de desarrollo. La seguridad de las contraseñas es solo una pequeña parte del SDLC seguro. Evita que los atacantes accedan a tus contraseñas desde el principio. El escáner estático de seguridad de aplicaciones Snyk Code revisa tu código en busca de vulnerabilidades conocidas y te indica cómo corregirlas.
Protege tus dependencias de código abierto
Las herramientas de Snyk, diseñadas para desarrolladores, generan pull requests de corrección con un clic para dependencias vulnerables de código abierto y sus dependencias transitivas.