Posterior a de una larga selección de datos dimos con la solución este rompecabezas que suelen tener muchos lectores. Te compartimos la solución y nuestro deseo es que te resulte de gran apoyo.
Solución:
Según la conversación en los comentarios, lo que quieres decir es hash contraseñas, no cifrar contraseñas Por lo general, haría esto con una sal para evitar un ataque de mesa de arco iris. El almacenamiento de contraseñas como hashes salados es el estándar de mejores prácticas cuando se trata de almacenar contraseñas en bases de datos.
A partir de la versión 3.2, MongoDB no tiene soporte nativo para el hash de contraseñas como lo brindan algunas bases de datos SQL, por lo que deberá implementarlo en Java.
Para generar una nueva cuenta o cambiar la contraseña de una cuenta existente:
- generar un valor salt aleatorio criptográficamente seguro con
java.security.SecureRandom
. Esta clase funciona como el generador de números aleatorios estándarjava.util.Random
(es una subclase) pero cambia el rendimiento por un nivel mucho más alto de imprevisibilidad que se requiere para un contexto relevante para la seguridad. - Crear un string concatenando sal y contraseña
- Genera un hash de eso string con una función hash criptográficamente segura. Hay muchas funciones hash provistas por Java listas para usar, pero desea usar una que sea intencionalmente difícil de calcular para ralentizar a un atacante con acceso a la base de datos que intenta forzar sus hash en su clúster de supercomputadora local. Un buen candidato es el algoritmo “PBKDF2WithHmacSHA1” que es compatible con el
javax.crypto.SecretKeyFactory
clase. - Guarde el documento en MongoDB con los campos
username
,password_hash
ypassword_salt
(además de los datos reales de su aplicación, por supuesto). No guarde la contraseña original.
Para recuperar una cuenta:
- Leer el
username_input
ypassword_input
el presunto usuario ingresó en su formulario de inicio de sesión. - Recuperar el documento donde se encuentra el
username
coincide con elusername_input
proporcionado por el usuario. - Consigue el
password_salt
campo de ese documento - Crear un string concatenando
password_salt
ypassword_input
como lo hiciste antes. - Genera un hash de eso string con la misma función hash criptográficamente segura.
- Compara el hash con el
password_hash
campo del documento. Cuando coincide, el usuario ingresó la contraseña correcta.
Alternativamente, solo podría recuperar los campos password_hash y password_salt del documento y no cargar el resto antes de que el usuario esté autenticado, pero supongo que en el mundo real causará más carga de la que ahorraría. Los inicios de sesión exitosos generalmente superan en gran medida a los fallidos, a menos que tenga un atacante que intente forzar una cuenta por fuerza bruta. Y en ese caso, bloquearía al atacante con fail2ban u otro mecanismo de limitación de inicio de sesión.
Agradecemos que desees amparar nuestro estudio añadiendo un comentario y dejando una puntuación te damos las gracias.