Revisión del enfoque para el hashing y el cifrado solo para el lado del cliente para la aplicación web

0

Antecedentes: tengo poco conocimiento de hash y cifrado, así que por favor, tenga paciencia conmigo. He publicado una pregunta relacionada aquí: enlace para la perspectiva de la programación, que puede dar algunos antecedentes. Esa pregunta era sobre la viabilidad general del producto en general. En cierto sentido, esta pregunta es un seguimiento, sobre la implementación real, pero como es más técnico desde el punto de vista de seguridad, sentí que sería mejor publicarlo aquí. Siéntase libre de publicar en cualquiera de las preguntas / ambas preguntas según corresponda.

Me han asignado la tarea de proteger los datos locales para una aplicación web que se puede usar sin conexión, por lo que la interacción con el servidor para la autenticación y el cifrado no es una opción. Esto sería opcional, para los usuarios que desean una capa adicional de protección además del cifrado del hardware.

La aplicación será para un solo usuario por dispositivo. El objetivo es tratar de reducir el riesgo de acceso no autorizado a datos confidenciales en caso de pérdida o robo de un dispositivo.

Mis ideas iniciales de cómo podría hacer esto son:

  • Exigir al usuario que ingrese una contraseña cada vez que se inicie la aplicación.
  • Hash la contraseña usando PBKDF2, almacenando el hash y la sal localmente, por ejemplo. en WebSQL.
  • El usuario luego ingresaría su contraseña, podría volver a hacer hash usando el salt cargado y compararlo con el hash almacenado.
  • Almacene la contraseña en una variable de JavaScript de forma local, ¿quizás utilizando un método de hashing diferente al que se usa para almacenar en la base de datos?
  • Use esto como una clave para cifrar y descifrar (usando AES) los datos en la base de datos.

Los datos locales se cifrarán, sin embargo, la lógica de cifrado / descifrado será evidente al mirar el código fuente de JavaScript. Por lo tanto, la clave utilizada para cifrar / descifrar no puede ser solo la contraseña almacenada y hash, como sería obvio.

P: ¿Cómo podría mejorarse este enfoque? ¿Sería suficiente el hash de la contraseña de dos maneras diferentes, una para el almacenamiento y otra para el cifrado / descifrado? ¿Podría hacer algo más, teniendo en cuenta las limitaciones de trabajar con el almacenamiento web y sin un servidor / hardware externo para ayudar?

También: aunque el usuario trabajará sin conexión con la aplicación, por lo que los datos deben ser locales y encriptados, habrá una conexión inicial al servidor para descargar la aplicación. Entonces, si hay algo que pueda hacer basado en esa conexión inicial que pueda ayudar, entonces hágamelo saber.

    
pregunta Adam Marshall 18.03.2014 - 12:48
fuente

1 respuesta

1

Lo estás haciendo mal. No hay ningún punto en absoluto para un hash para la autenticación si las comparaciones se realizan localmente porque un atacante simplemente puede inyectar el valor de hash directamente en la memoria y omitir la verificación de autenticación.

Para propósitos locales, tienes que usar algo como tu segunda parte de tu idea, pero esa parte debe hacerse usando los estándares existentes. Lo que necesitas es una función de derivación clave. Una función de derivación de claves es un algoritmo que puede tomar una contraseña de forma segura y utilizarla para formar una clave de cifrado. Dado que las claves que se construyen suelen ser relativamente débiles, debe usarse para cifrar una clave verdaderamente aleatoria que luego se usa para el cifrado y descifrado real de la base de datos.

Usando un enfoque basado en cifrado, se vuelve irrelevante si el usuario fuerza una clave en la memoria porque no podrá acceder a los datos cifrados. El cifrado actúa como mecanismo de autenticación y protección de datos. (Si desea una forma de verificar el descifrado correcto, siempre puede cifrar un valor conocido y verificar el descifrado de ese valor).

    
respondido por el AJ Henderson 18.03.2014 - 14:17
fuente

Lea otras preguntas en las etiquetas