Estoy trabajando en una aplicación en la que quiero proporcionar cifrado de extremo a extremo en los archivos, donde varios usuarios pueden acceder a estas carpetas. Me gustaría que el cifrado sea lo más transparente y sin fricciones posible (no quiero que los usuarios tengan que administrar sus propias claves), por lo que he estado considerando formas de hacerlo.
Los requisitos para este protocolo son:
- Los usuarios no tienen que administrar su propia clave
- Los usuarios deben poder usarlo desde múltiples dispositivos
- Al cambiar de dispositivo, los usuarios aún deben tener acceso a sus archivos antiguos
Mis pensamientos actuales son:
- Cuando un usuario se registra, genera un par de llaves (lado del cliente)
- Encripta su clave privada con una clave simétrica derivada de salt + password (lado del cliente)
- Cargar clave pública, clave privada encriptada,
hash(salt + password)
y saltear a API - lado del servidor, almacenar clave pública y clave privada encriptada. Como la contraseña del usuario se usa para cifrar su clave privada, no se puede transmitir nunca en texto sin formato al servidor. Si, en cambio, se transmite un hash, no se revela su contraseña, pero si un atacante violara la base de datos, sería posible usar el hash para iniciar sesión en su cuenta, pero no descifrar los archivos. Para solucionar este problema, el hash de contraseña transmitido se reinicia en el servidor y se almacena.
- Cuando un usuario crea una carpeta, genera una nueva clave simétrica y encripta estos archivos con esa clave (lado del cliente)
- Cifre esta clave simétrica usando la clave pública del usuario (lado del cliente)
- Cuando el usuario inicie sesión, descargue su clave privada pública y encriptada
- Descifrar clave privada, almacenar en dispositivo
- Use la clave privada para descifrar la clave simétrica, luego descifre los archivos
- Para otorgar acceso a la carpeta que es propiedad de A a otro usuario B, el usuario A obtiene la clave pública para el usuario B de la API, descifra la clave simétrica de la carpeta con su propia clave privada, luego encripta nuevamente la clave simétrica usando la clave pública de B Antes de transmitirlo de nuevo a la API. El usuario B puede recuperar la clave simétrica cifrada, descifrarla utilizando su clave privada y descifrar el contenido de la carpeta
¿Tiene sentido este enfoque (desde una perspectiva de seguridad y usabilidad)? ¿Hay alguna advertencia o trampa potencial?
Entiendo que hay N veces protocolos para el cifrado asimétrico multipartidista, sin embargo, como los archivos en lugar de los mensajes que se almacenan no son realistas desde la perspectiva del ancho de banda.