He leído un montón de respuestas y tutoriales sobre cómo la criptografía del lado del cliente no es una buena idea debido a muchas razones enumeradas principalmente en Criptografía Javascript considerada dañina . Algunos hechos
- La aplicación utilizará HTTPS
- Habrá validación del lado del servidor y del cliente
- No hay un vínculo entre la contraseña del usuario y el siguiente escenario
- El lado del servidor es un servicio web RESTful (sin sesión alguna)
- El backend emite JWT a los usuarios
- El backend puede permitir tanto al usuario / contraseña como a oauth (es decir, fb, twitter, etc.)
¿Qué deseo cifrar en el lado del cliente?
El usuario ingresará información personal (es decir, nombre, dirección, número de teléfono) a través de una aplicación de interfaz (es decir, Vue.js, Angular, React, etc.)
¿Cómo me imagino que esto va a funcionar?
El usuario selecciona campos (es decir, partes y partes de información personal), y luego hace clic en cifrar. El usuario proporcionará una clave de cifrado. La interfaz utilizará un poco de js crypto library
y cifrará la información, la reemplazará en el DOM
e informará al usuario para hacer una copia de seguridad de la clave de cifrado.
¿Cómo comunico esta información al servidor?
El frontend realizará una solicitud HTTP PUT
o POST
con la información personal (ya sea simple / texto o gibberish) al servidor. El servidor no se preocupa por los datos entrantes (es decir, excepto por SQL u otras formas de inyecciones) y los almacena en la base de datos de inmediato. Esta solicitud no contendrá el encryption key
, pero podría contener un indicador / s para especificar qué campos se cifraron.
¿Cómo descifrar?
Cuando el usuario solicita la información, el backend devuelve todo lo que hay en el servidor tal como está. La información si está encriptada se mostrará como gibberish
al usuario. Usando indicadores, el sistema les dará la opción decrypt
y al hacer clic en ellos les pedirá que ingresen encryption key
y realice el descifrado localmente.
¿Último propósito?
En primer lugar, se hará todo lo posible para asegurarnos de que el servidor y la base de datos y todo estén a prueba de balas, pero, si por alguna razón el servidor es pirateado, el pirata informático terminará con mucha información relacionada con el engaño. informacion personal.
La pregunta definitiva
Al leer a través de Internet, la criptografía en Javascript
está totalmente desaconsejada, por lo tanto, mis preguntas
- Teniendo en cuenta el escenario y el requisito anterior, ¿cuáles son los riesgos que imponen la implementación anterior?
- ¿Hay algún enfoque que recomiende, donde solo el usuario tenga el control de la clave, no se almacene en ningún lugar?
- Si tuviera que cifrar esta información en el backend, ¿cómo puedo comunicar el
encrypt key
de forma segura al usuario? ¿Tal vez encripte la información con la clavexyz
y luego proporcione un enlace seguro al usuario para hacer clic y ver la clave de encriptaciónxyz
, ...? - ¿Qué otras sugerencias existen para el cifrado de front-end, basado en back-end?
Me gustaría darle la confianza al usuario de que solo ellos saben cómo descifrar la clave. ¿Cómo puedo lograr eso de una manera más eficiente? ¿Sin tener que almacenar y gestionar la clave de cifrado?
Actualización 17 de julio de 2018
Sobre la base de la respuesta aceptada, escribí una publicación mediana sobre cómo implementé la solución aquí es el enlace enlace