Estoy buscando algunos consejos sobre el diseño de una aplicación web segura para almacenar contraseñas. ¿Por qué reinventar la rueda? Porque no confío en un tercero con todas mis contraseñas.
Aquí están mis pensamientos:
- Hay 3 componentes principales: Cliente, Servidor de aplicaciones, Servidor de base de datos. Idealmente, me gustaría que el sistema fuera lo suficientemente robusto, de modo que si el Servidor de aplicaciones o el Servidor de bases de datos se ve comprometido, el atacante no obtiene todos los datos (si el cliente está comprometido, no puedo ver ninguna forma de proteger los datos).
- Para lograr esto, creo que hacer todo el cifrado en el Cliente tiene sentido. Por lo tanto, si el Servidor de base de datos está comprometido, solo obtendrían datos cifrados, y si el Servidor de aplicaciones está comprometido, no obtendrían las claves de cifrado porque el Cliente las guarda.
-
Eso crea al menos 2 problemas:
-
En este contexto,
crypto del lado del cliente significa javascript crypto que es problemático . Aquí es cómo planeo solucionar algunos de los problemas principales.
- No es bueno CSPRNG. Solo use los navegadores con getRandomValues () y use una biblioteca criptográfica js que lo admita.
- Hombre en el medio. Forzar TLS para todas las conexiones (no ayuda si el servidor de aplicaciones está comprometido, por supuesto).
- Vulnerabilidad de XSS. Escriba una secuencia de comandos de usuario complementario (Greasemonkey) que calcula los hashes de cada página en la aplicación y alerta al usuario cuando cualquier contenido de la página ha cambiado. Obviamente, esto dará lugar a falsos positivos cuando realice actualizaciones, pero debería permitirle detectar si alguien ha modificado su código en el Servidor de aplicaciones o ha inyectado con éxito algún contenido en la página.
-
La búsqueda de datos encriptados es complicada .
- Todavía no tengo soluciones concretas para esto, pero si el plan general parece factible, hay buenas opciones por ahí.
-
En este contexto,
Me doy cuenta de que esta pregunta es un poco amplia, así que siéntete libre de cerrarla si no es una buena opción para el sitio. Solo espero obtener una orientación general sobre lo que podría faltar o dónde están los agujeros en mi plan.
Actualización: Gracias a todos por los comentarios tan útiles. A la luz de algunas de las cuestiones planteadas, mi nuevo plan es hacer que todo sea mucho más simple. Mantenga un archivo JSON único, comprimido y cifrado en el servidor. Escribe una aplicación JS que se ejecuta localmente. Todo lo que hace es agarrar el archivo, descifrarlo localmente y luego volver a cargarlo cuando se realicen los cambios. ¿Pensamientos?
También, veo su punto de vista sobre el uso de un sistema bien probado y comprobado. Llámame parachoques de papel de aluminio, pero no puedo confiar en que alguien más tenga ese acceso. Todo lo que necesita es un empleado / colaborador disgustado o un agujero de seguridad para Que tengas un mal día.