Contraseñas: almacenar encriptadas, ver en texto sin formato

1

Ya hice esa pregunta en stackoverflow pero me informaron que es un poco demasiado amplio y confía más aquí. Así que déjame copiar y pegar lo que pregunté allí:

Tengo un dilema relacionado con la seguridad que no puedo resolver por mi cuenta a partir de mi conocimiento sobre la seguridad de las aplicaciones web.

Digamos que quiero crear un servicio donde el usuario pueda almacenar y VER en texto sin formato sus contraseñas para múltiples servicios. En tal caso, tenemos algunas cosas que considerar: medidas de seguridad básicas al cifrar las contraseñas almacenadas con hash, cómo proteger las contraseñas en caso de que hubieran sido robadas de la base de datos, por ejemplo, eliminando la base de datos por el atacante.

Esto significa que las contraseñas deben almacenarse encriptadas, pero es posible mostrarlas a un usuario en texto sin formato. La forma estándar de almacenar las contraseñas para la autenticación es agruparlas, por ejemplo, con bcrypt u otro método con sal agregado, y dicho cifrado no le permite descifrar las contraseñas fácilmente.

¿Es lo que quiero incluso posible lograr? ¿O hay algún otro enfoque que deba tomar en lugar de hash pero que aún sea seguro para almacenar múltiples contraseñas a múltiples servicios por un solo usuario?

Simplemente agregaré que supongamos que una contraseña única o un conjunto de contraseñas es una publicación de blog para ver en un texto sin formato solo por el autor de dicha publicación y en circunstancias específicas por administrador y moderador.

La tecnología en sí misma probablemente no sea lo más importante aquí, pero voy a realizar esta aplicación utilizando php y laravel framework.

Una cosa es almacenar y ver. Otra cosa es cómo asegurar dicha aplicación de varios tipos de secuestros de mensajes cifrados, volcados de bases de datos y ataques similares.

    
pregunta spectatorx 29.09.2018 - 17:16
fuente

3 respuestas

1

En general:

  • Un hash unidireccional es no reversible (de ahí el término unidireccional)
  • El cifrado es reversible (siempre que tenga la clave de descifrado)

Para la autenticación regular, usamos hashes de contraseña de la tienda en la base de datos. Luego, introducimos una contraseña introducida por el usuario y la comparamos con el hash en la base de datos. De esta manera podemos autenticar a un usuario sin tener que almacenar la contraseña. Si el usuario elige una contraseña "segura", será imposible (o al menos inmensamente difícil) obtener la contraseña de texto simple de los usuarios, incluso si todo el sistema estuviera comprometido.

Sin embargo, lo que está solicitando es recuperar la contraseña de texto sin cifrar, que no es necesaria en la mayoría de los casos. El usuario ya conoce su contraseña (de lo contrario, no habría podido iniciar sesión) y, si el usuario la hubiera olvidado, generalmente restableceríamos la contraseña al autenticar primero una dirección de correo electrónico o número de teléfono, y luego volver a ingresar escribiendo el hash para la nueva contraseña.

Si, por el contrario, solicita almacenar "datos" en la cuenta que no tiene acceso para nadie sin la contraseña, la solución general que utilizan la mayoría de los administradores de contraseñas es cifrando los datos con la clave derivada de la contraseña del usuario. (porque las contraseñas de los usuarios pueden ser bastante débiles). Los datos pueden ser un blob encriptado, que se descifraría en el extremo del usuario utilizando su clave derivada.

El inconveniente (más o menos) es que si el usuario pierde su contraseña, no se recuperan estos datos, pero para la mayoría de los administradores de contraseñas, esto es en realidad una "característica" porque nadie quiere que estos datos se almacenen de forma clara en ningún servidor.

Una vez más, la solución sería bastante inútil si el usuario eligiera 'Password1234' como su contraseña maestra, pero hay otras soluciones para eso.

    
respondido por el keithRozario 01.10.2018 - 07:37
fuente
0

Una configuración segura

Recomiendo cifrar las contraseñas de los usuarios utilizando una clave derivada de la contraseña normal del usuario. Yo usaría bcrypt para almacenar su contraseña, PBKDF2 para generar una clave y AES para el cifrado. Una configuración podría ser:

  • Almacene la contraseña normal del usuario con bcrypt;
  • Cuando el usuario inicie sesión correctamente, use PBKDF2 en Javascript para generar la clave derivada del usuario en el navegador;
  • Envíe al usuario su blob encriptado (AES);
  • Descifre el blob en Javascript, en la memoria del navegador;
  • Cuando el usuario haya terminado de hacer lo suyo, pídale que envíe un blob encriptado (AES).

De esta manera, el servidor nunca verá la contraseña de un usuario o su clave de cifrado. Romper el cifrado significaría forzar la contraseña del usuario de forma brutal, en cuyo caso podrá acceder a los datos del usuario de todos modos.

Otras ideas

Me gustaría agregar que podría no ser necesario que los usuarios vean sus contraseñas. Por ejemplo, la mayoría de los administradores de contraseñas no muestran las contraseñas sino que las copian directamente en el portapapeles. Podría tener su blob descifrado en la memoria y algo así como un botón [copiar] que copia la contraseña en su portapapeles. Esto no solo sería más seguro, sino también más conveniente para sus usuarios.

    
respondido por el Graa 29.09.2018 - 18:01
fuente
0

Por lo que entiendo, estás intentando construir un administrador de contraseña / bóveda. No puede utilizar el hash para el almacenamiento de datos en ese caso.

Definitivamente, sería mejor utilizar uno que ya existe, ya que es muy fácil equivocarse.

Tendría que usar una clave simétrica criptográfica para cifrar las contraseñas y derivar la clave de la contraseña de un usuario.

No recomendaría que hagas esto tú mismo, hay muchas formas de salir mal. Es decir. teclas débiles / función criptográfica, almacenamiento / transmisión incorrecta de la clave secreta, integridad de los datos, violaciones de la base de datos, etc. ...

Como se mencionó, consulte OWASP para conocer las pautas de seguridad de la aplicación. Creo que hay una hoja de trucos para ayudar a los desarrolladores a construir un mejor software también.

    
respondido por el Exhibitioner 29.09.2018 - 18:54
fuente

Lea otras preguntas en las etiquetas