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.