Cifrando los datos del usuario usando una contraseña y olvidé mi contraseña

14

Estoy planeando hacer una aplicación web que almacene muchas cosas personales (información, fotos ...). Y para dar a los usuarios un sentido de protección, quiero cifrar los datos antes de almacenarlos en la base de datos.

Por lo tanto, en la base de datos almacenaré el hash de la contraseña (para validarla) y los datos del usuario (encriptados con la contraseña como clave (o clave derivada de la contraseña)).

¿Cómo puedo proporcionar una opción para olvidar mi contraseña? Veo que la única forma es almacenar la clave en algún lugar, lo que elimina la ventaja de encriptar los datos en primer lugar.

    
pregunta Yousf 03.02.2013 - 11:01
fuente

3 respuestas

13

La forma estándar de hacerlo es la siguiente:

  1. Cree un hash de autenticación utilizando un algoritmo de derivación de clave con sal, como PBKDF2 o bcrypt.
  2. Genere una clave sustituta aleatoria para el cifrado de datos. Cifre todos los datos con esta clave.
  3. Genere una clave de "bloqueo" a partir de la contraseña usando un salt diferente, pero aún usando un KDF fuerte.
  4. Xo la clave sustituta con la clave de bloqueo y almacene ese valor. Esto hace que la clave maestra sea desconocida a menos que la contraseña sea desconocida.
  5. Al iniciar sesión, genere la clave de bloqueo y xor con la clave sustituta almacenada, que le da la clave sustituta real.

El beneficio de este sistema es que permite cambios de contraseña fáciles: solo use la contraseña antigua para descifrar la clave sustituta, luego genere una nueva clave de bloqueo a partir de la nueva contraseña.

Al usar un mecanismo de este tipo, la forma única de descifrar los datos es tener la contraseña, a menos que cree una segunda copia cifrada de la clave sustituta usando otro secreto.

Así es como lo haría:

  1. Pídale al usuario que le proporcione 3 respuestas secretas. Convertir las respuestas en mayúsculas y concatenarlas. Ejecute ese valor a través de un KDF para crear una clave de bloqueo secundaria.
  2. Xo la clave sustituta con la clave de bloqueo secundaria y guárdela como una clave de respaldo.
  3. Cuando el usuario olvide su contraseña, pídales sus respuestas secretas y genere la clave de bloqueo secundaria, luego úsela para calcular la clave sustituta.

La opción de respuestas secretas es la más fácil, pero es posible hacerlo con cualquier valor secreto.

    
respondido por el Polynomial 03.02.2013 - 12:30
fuente
8

Hay dos maneras de solucionar el problema de la "contraseña olvidada":

  1. Cifre los datos no con una contraseña, sino con dos contraseñas. Para que sea eficiente, use una clave intermedia: un archivo de datos se cifra con una clave de archivo aleatoria K , y la clave K se cifra dos veces: una vez con la primera contraseña, y Una vez con la segunda contraseña. De todos modos, realmente desea una clave intermedia, para admitir cambios de contraseña sin tener que volver a cifrar todos los datos.

    En ese escenario, la segunda contraseña será la "contraseña de respaldo" que el usuario no olvidará. Este tipo de milagro (¿cómo puede el usuario no olvidar una contraseña que nunca usa, ya que logró olvidar la contraseña que usa regularmente?) Se puede lograr de varias maneras: la contraseña de respaldo podría ser una larga secuencia de caracteres que el usuario escribe en una hoja de papel, almacenada en una caja fuerte (o en su billetera); la contraseña de respaldo podría consistir en respuestas a "preguntas de seguridad" (como sugiere @Polynomial); ...

  2. Utilice clave de custodia . Una copia de la contraseña del usuario, o de una clave intermedia K , podría ser almacenada por un "Tercero de confianza", para ser desbloqueada en caso de emergencia. El TTP tendría que estar adecuadamente protegido y acordar desbloquear secretos en depósito solo como parte de una ceremonia oficial, controlada y auditada en la que el propietario de los datos (el usuario que olvidó su contraseña) prueba su identidad a través de algún medio físico (por ejemplo, entrando persona que muestra y su licencia de conducir). El paso de custodia se puede realizar sin interactuar con la TTP si se usa encriptación asimétrica : la TTP tiene un par de claves RSA , la contraseña del usuario se cifra con la clave pública, y la TTP usa la clave privada para desbloquear la contraseña perdida.

    El hecho de que se pueda aplicar el depósito de claves depende realmente del contexto y, en última instancia, cuánto puede hacer que el usuario pague por el desbloqueo de sus valiosos datos. En una situación diferente, la tecnología de cifrado de la unidad BitLocker de Microsoft (incluida en las versiones recientes / costosas de Windows) es compatible con el depósito de claves para que sysadmin puede guardar los datos de los usuarios que olvidaron su contraseña.

    La custodia de claves significa que el servidor (con la ayuda de la TTP) puede, en teoría, desbloquear los datos del usuario sin su consentimiento o conocimiento. Esto es bueno, los datos del usuario no son realmente suyos, y el usuario no está disponible (por ejemplo, en una empresa, cuando un usuario es golpeado por un bus, su sucesor debe poder leer los datos comerciales almacenados, y el inquilino anterior no puede ya dale su contraseña). A la inversa, el sitio Mega muy alabado renuncia deliberadamente a todo tipo de custodia y recuperación de contraseña perdida precisamente para determinar, de una manera muy legal, que no tienen forma de acceder a los datos sin la colaboración del usuario.

respondido por el Thomas Pornin 03.02.2013 - 15:20
fuente
1

Ponga una forma un poco menos descriptiva, pero más conceptual, básicamente desea proporcionar dos medios diferentes para obtener la misma clave. Esta es la idea de tener una clave de datos, generalmente única para un registro, o quizás para todos los registros de un usuario, dependiendo de las necesidades de seguridad. Luego, encripta esa clave con una clave derivada de su contraseña y una clave derivada de algún otro dato. Podría ser una cosa alternativa que ellos saben o podría ser algo que su servidor sepa. Esto puede ser criptografía simétrica o, para mayor seguridad, la información que su servidor sabe puede usar una clave pública para una clave privada que no se encuentra en el servidor.

Luego, si el usuario alguna vez pierde la contraseña y no puede acceder a la clave de datos, se puede descifrar el cifrado alternativo para recuperar la clave. En orden de seguridad, el almacenamiento simétrico de la clave en el servidor es menos seguro, ya que si el servidor y la base de datos están comprometidos, el cifrado se vuelve inútil. La información del usuario puede ser un poco mejor, pero para que sea fácil de recordar, también es fácil de investigar o adivinar, lo cual es inseguro incluso si el servidor no está comprometido. La opción asimétrica donde el servidor no tiene acceso a la información necesaria para un restablecimiento (porque solo sabe cómo cifrar la versión de recuperación de la clave de datos es la más segura, pero también es la más difícil desde el punto de vista de la usabilidad como el descifrado debe realizarse a) manualmente b) por un servidor secundario altamente seguro, preferiblemente manteniendo la clave privada en un TPM (módulo de plataforma confiable) o en algún otro almacén de claves de hardware seguro.

De cualquier manera, sin embargo, el principal básico es el mismo. Siempre hace que la clave sea irrecuperable sin el secreto, simplemente la almacena varias veces con diferentes secretos.

    
respondido por el AJ Henderson 04.02.2013 - 15:17
fuente

Lea otras preguntas en las etiquetas