Contraseña secundaria almacenada de forma segura

0

Actualmente estoy escribiendo un sitio de portal para Microsoft Dynamic CRM, el portal funciona así:

  • Cada usuario tiene su propia cuenta para iniciar sesión en mi portal.
  • A cada usuario se le asigna una credencial de CRM separada por el administrador. Actualmente, tanto el nombre de usuario como la contraseña para el sitio de CRM se almacenan como texto sin formato (la contraseña para el propio portal está correctamente hash, salted, ... usando AspNet Identity Core).
  • Después de iniciar sesión en mi portal, los usuarios se autenticarán con el sitio de CRM en segundo plano y podrán comenzar a ver, agregar, editar y eliminar registros en el sitio de CRM.
  • Los usuarios pueden cambiar su propia contraseña de portal, pero las credenciales de CRM son fijas y solo pueden ser cambiadas por el administrador.

Obviamente no querría almacenar la credencial de CRM en texto sin formato, pero no puedo encontrar ninguna solución que funcione para mi problema. He considerado las siguientes opciones:

  1. Hash contraseña de CRM y almacenar el hash. Esto no funciona porque necesito la contraseña original para autenticar con el sitio de CRM.

  2. Derivó una clave de la contraseña del usuario y cifró la contraseña de CRM, luego almacene la contraseña cifrada (estilo del administrador de contraseñas). No funciona porque El administrador no podrá cambiar la contraseña de CRM.

  3. Igual que 2, pero use la contraseña de administrador para derivar la clave de cifrado. Esto tampoco funciona porque entonces ya no puedo autenticar a los usuarios con el sitio de CRM.

pregunta tsukumogami 01.06.2016 - 07:09
fuente

1 respuesta

1

Las contraseñas son datos que enfrenta el usuario. Si tiene una "contraseña" que no está establecida ni utilizada por un usuario, se denomina "clave" o "secreto" (la terminología exacta varía según el uso). Así que necesitas investigar el almacenamiento de claves, no el almacenamiento de contraseñas.

Hay dos partes para asegurar una clave:

  1. Elija una clave aleatoria segura criptográficamente. Algo así como 128 bits de un CSPRNG funcionará muy bien. Puede codificar la clave en base64 si desea almacenarla como texto.

  2. Encripta, no hash, la clave cuando no es necesaria. Use algo como AES 256 para el cifrado. Esto conduce a un pequeño problema circular ya que necesita almacenar esa credencial de forma segura. El mejor lugar para eso es en un HSM. Si eso no es posible, almacenarlo en algún lugar tendrá que hacerlo. Simplemente no lo ponga en la misma base de datos que las claves en caso de que un atacante obtenga acceso a la base de datos.

respondido por el Neil Smithline 01.06.2016 - 21:18
fuente

Lea otras preguntas en las etiquetas