¿Cómo sincronizar el cambio de contraseña en mi aplicación con el servidor?

0

Ya terminé una aplicación web con un backend seguro y contraseñas de acceso y ahora estoy trabajando en una versión de Android. Almaceno todos los datos cruciales en una base de datos cifrada utilizando SQLCipher y utilizo la contraseña del usuario para cifrarla. E intentaré mostrarte dónde está mi problema:

  1. El usuario inicia sesión en la aplicación web
  2. El usuario cambia la contraseña
  3. El usuario inicia sesión en la aplicación de Android
  4. Ahora que se cambió la contraseña, no tengo forma de descifrar mi base de datos porque ya no tengo acceso a la contraseña que se usó para cifrarla.

No quiero almacenar la contraseña del usuario en texto sin formato en cualquier lugar, y enviarla desde el servidor tampoco es una opción. ¿Cómo resuelvo este problema?

    
pregunta Ernest Zamelczyk 24.03.2017 - 09:45
fuente

2 respuestas

0

¿Funcionaría si el usuario seleccionara una lista de dispositivos para actualizar cuando cambian la contraseña en el sitio web?

Si es así, la aplicación podría generar un par de claves y publicar la clave pública en el servidor una vez que se hayan conectado / autenticado (solo necesitan hacerlo una vez / rara vez). Al cambiar la contraseña, cifraría la nueva contraseña con la clave pública y la almacenaría en algún lugar para que la aplicación de Android verifique el próximo inicio. Nadie podrá descifrar la nueva contraseña aparte de ese dispositivo en particular.

(Si el dispositivo Android se ve comprometido y las claves privadas se leen, entonces presumiblemente lo mismo pasaría con cualquier contraseña rotada. Tal vez esta es la razón por la cual el usuario está cambiando su contraseña, en cuyo momento "seleccionar dispositivos para actualizar" es un paso importante.)

    
respondido por el cloudfeet 24.03.2017 - 12:01
fuente
0

Debería usar una API web para permitir un cambio de contraseña en el servidor y activar esa API desde la aplicación. De esa manera, el usuario solo debería poder cambiar su contraseña desde la aplicación y mientras está conectado al servidor. Pero la contraseña del usuario no debe usarse para cifrar directamente la base de datos, sino solo para cifrar una clave (grande y aleatoria). El flujo de trabajo general podría ser:

  • el usuario solicita un cambio de contraseña en la aplicación
  • la aplicación solicita la contraseña antigua y nueva
  • la aplicación confirma la contraseña anterior con el servidor a través de una conexión segura (cifrada con SSL) - opcional
  • la aplicación le pide al servidor que cambie la contraseña dando las antiguas y las nuevas a través de una conexión segura
  • la aplicación decodifica la clave de la base de datos con la contraseña anterior
  • la aplicación codifica la clave de la base de datos con la nueva contraseña y la guarda en un almacenamiento permanente

De esa manera, la experiencia del usuario es correcta porque solo declaró su cambio de contraseña una vez y, después de eso, la aplicación y el servidor siguen sincronizados.

Desafortunadamente, esto es solo un flujo de trabajo general, ya que incluso si es inmune a una falla de conexión temprana (simplemente mantenga la contraseña antigua si el servidor no pudiera cambiarla), el peor caso sería si el servidor pudiera cambiar su contraseña pero perder La conexión antes de reconocerlo a la aplicación. Como de costumbre, el diablo está oculto en los detalles de la falla del peor de los casos y el protocolo real debe garantizar que ambas partes regresen al estado anterior si ocurre un problema antes del final.

    
respondido por el Serge Ballesta 22.06.2017 - 15:55
fuente

Lea otras preguntas en las etiquetas