Estoy trabajando en una aplicación web y quiero ofrecer a los usuarios la opción de "cifrar" su cuenta. Esto no cifraría todo lo relacionado con ellos en la base de datos. Solo ciertos campos críticos.
Ya he leído la gran respuesta de DW sobre el problema ( enlace ), y a pesar de todo eso , Quiero seguir adelante con esto, debido a algunas diferencias clave:
Lo primero y más importante: ninguno de los datos que estoy cifrando es de importancia crítica. Esta es una aplicación de juguete, sobre todo para que yo aprenda y quizás incluya un currículum. No hay usuarios reales.
En segundo lugar, estoy usando marcos y tecnologías existentes. Es una aplicación de Django, así que ya tengo un montón de protecciones y algunos valores predeterminados sanos como la protección csrf. Soy consciente de que no es un polvo mágico de duendes lo que hará que mi aplicación sea segura, pero "... todavía estoy aprendiendo y haciendo lo mejor que puedo".
Con eso fuera del camino, así es como quiero implementarlo:
- El usuario registra una cuenta. Durante el registro, se les da la opción de cifrado de cuenta y una contraseña separada para usar en los campos cifrados.
- Las cuentas cifradas tienen un bool
encrypted
, establecido en verdadero. Esa es la única diferencia en las cuentas en el backend. - Cuando el usuario inicia sesión, si
encrypted=True
, aparece un mensaje para que escriba su contraseña, que se almacena en la memoria del lado del cliente, y utiliza JS crypto del lado del navegador (lo sé, lo sé ... ) para cifrar / descifrar las entradas.
Quiero asegurarme de que nadie más que el usuario pueda leer sus propias entradas, y esto parece ser una forma sencilla de lograr ese objetivo. Pero, como esto es seguridad, probablemente hay un millón de maneras de hacer esto mal, y no hay una manera perfecta de hacerlo, así que estoy muy interesado en las opiniones de alguien más conocedor que yo, y estaría realmente agradecido si alguien pudiera señale las vulnerabilidades potenciales o las áreas donde las cosas pueden salir mal.