Gestión de sesiones para frases de contraseña privadas en una aplicación web

4

Caso de uso

Me gustaría cifrar los datos en una base de datos para una aplicación web. Existen los siguientes requisitos:

  • El descifrado solo debe ser posible cuando un usuario proporciona una frase de contraseña
  • El cifrado siempre debería ser posible

Por lo tanto, uso cifrado asimétrico usando claves públicas y privadas. La aplicación web puede anular una operación de cifrado en cualquier momento, pero la aplicación web solo se puede descifrar cuando el usuario proporciona una frase de contraseña.

Problema

Todo esto funciona bien, pero el problema que tengo es que cada vez que el usuario desea descifrar los datos, debe proporcionar una frase de contraseña. Me gustaría proporcionar al usuario la opción de "permanecer autenticado" para una sesión, después de que ingrese la contraseña una vez.

Aquí es donde estoy teniendo problemas. Si decido que la clave es un hash de la contraseña en la sesión, el servidor técnicamente podrá descifrar los datos sin la entrada del usuario. Recordar un hash de frase de contraseña en una cookie tampoco es una opción.

¿Qué opciones comunes tengo? ¿Es posible que mi enfoque general sea incorrecto?

¿Posible solución?

Después de pensar, planeo implementar lo siguiente:

  • El usuario envía la frase de contraseña al servidor
  • El servidor crea una clave aleatoria de 128 bits
  • El servidor codifica la contraseña y la cifra con la nueva clave aleatoria usando AES
  • El hash cifrado se almacena en la sesión en el servidor
  • Los usuarios almacenan en su cookie: ID de sesión y clave de cifrado
  • Solo cuando ambos reciben una solicitud, el servidor puede descifrar los datos
  • La sesión dejará de ser válida después de un cierto período de tiempo

¿Es este un enfoque seguro?

Los datos solo se pueden descifrar si:

  • Se recuperan los datos cifrados
  • Se recupera la clave privada
  • Los datos de la sesión se recuperan
  • Se recuperan las cookies de usuario

Notas :

  • Los datos en sí no están cifrados con la clave pública, pero se genera una clave aleatoria y se utiliza para cifrar los datos mediante AES. Esta clave se encripta con la clave pública, lo que permite algún tipo de gestión de usuarios.

  • Todo se ejecuta en HTTPS

  • La clave privada está cifrada con un hash de la frase de contraseña, no la frase de contraseña en sí misma

Gracias de antemano

    
pregunta nanotvi 27.10.2014 - 10:35
fuente

1 respuesta

1

Lo que has descrito es muy similar (casi idéntico) a los conceptos básicos del estándar OpenPGP . Sería prudente leer sobre OpenPGP antes de intentar su propia implementación de este esquema.

Para responder a su pregunta planteada aquí:

  

Aquí es donde estoy teniendo problemas. Si decido que la clave es un hash de la contraseña en la sesión, el servidor técnicamente podrá descifrar los datos sin la entrada del usuario. Recordar un hash de frase de contraseña en una cookie tampoco es una opción.

Esto es una tautología. Mientras no mantenga un paradigma de texto cifrado de entrada / salida para su servidor, siempre podrá descifrar los datos almacenados en algún momento. Lo mejor que puede hacer es requerir la entrada del usuario para cada operación.

    
respondido por el Tim Lamballais 27.10.2014 - 16:33
fuente

Lea otras preguntas en las etiquetas