sql >> Base de Datos >  >> NoSQL >> MongoDB

Cifrar campos de contraseña en mongodb

De acuerdo con la conversación en los comentarios, lo que quieres decir es hashing contraseñas, no cifradas contraseñas Por lo general, haría esto con una sal para evitar un ataque de mesa de arco iris. Almacenar 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:

  1. generar un valor salt aleatorio criptográficamente seguro con java.security.SecureRandom . Esta clase funciona como el generador de números aleatorios estándar java.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.
  2. Cree una cadena concatenando sal y contraseña
  3. Genera un hash de esa cadena 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 javax.crypto.SecretKeyFactory clase.
  4. Guarde el documento en MongoDB con los campos username , password_hash y password_salt (además de los datos reales de su aplicación, por supuesto). No guarde la contraseña original.

Para recuperar una cuenta:

  1. Lea el username_input y password_input el presunto usuario ingresó en su formulario de inicio de sesión.
  2. Recupere el documento donde se encuentra el username coincide con username_input proporcionado por el usuario.
  3. Obtenga la password_salt campo de ese documento
  4. Cree una cadena concatenando password_salt y password_input como lo hiciste antes.
  5. Genera un hash de esa cadena con la misma función hash criptográficamente segura.
  6. Compare 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ías al atacante con fail2ban u otro mecanismo de limitación de inicio de sesión.