Codificación de extremo a extremo con múltiples usuarios

4

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:

  1. Los usuarios no tienen que administrar su propia clave
  2. Los usuarios deben poder usarlo desde múltiples dispositivos
  3. Al cambiar de dispositivo, los usuarios aún deben tener acceso a sus archivos antiguos

Mis pensamientos actuales son:

  1. Cuando un usuario se registra, genera un par de llaves (lado del cliente)
  2. Encripta su clave privada con una clave simétrica derivada de salt + password (lado del cliente)
  3. Cargar clave pública, clave privada encriptada, hash(salt + password) y saltear a API
  4. 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.
  5. Cuando un usuario crea una carpeta, genera una nueva clave simétrica y encripta estos archivos con esa clave (lado del cliente)
  6. Cifre esta clave simétrica usando la clave pública del usuario (lado del cliente)
  7. Cuando el usuario inicie sesión, descargue su clave privada pública y encriptada
  8. Descifrar clave privada, almacenar en dispositivo
  9. Use la clave privada para descifrar la clave simétrica, luego descifre los archivos
  10. 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.

    
pregunta Benedict Lewis 30.11.2017 - 12:12
fuente

2 respuestas

0

Su enfoque tiene sentido en cuanto al uso de una clave simétrica para cifrar los archivos, y compartir esa clave entre usuarios autorizados que usan claves públicas para mantenerlo en secreto.

Para resolver los problemas relacionados con el almacenamiento de claves privadas en su servidor (aunque estén cifradas), puede emitir un nuevo par de llaves a un usuario cada vez que inicie sesión desde un nuevo dispositivo. Esto permitiría a sus usuarios desasociarse de cualquier par de llaves dado si se pierde un dispositivo, se elimina la aplicación, etc. Esto también le brindaría la flexibilidad de eliminar dispositivos individuales en caso de robo, aunque eso requeriría volver a cifrar todos los archivos asociados con ese usuario. con una nueva clave simétrica.

    
respondido por el user8675309 30.11.2017 - 21:00
fuente
0

¿Ha consultado Signal Protocol ( wikipedia ) y biblioteca de libsignal para C, Java y Javascript?

Creo que cumple con sus tres requisitos, además tiene la ventaja de estar muy bien construido por un equipo de expertos en criptografía y, a menos que usted sea un equipo de expertos, va a cometer errores de criptografía.

    
respondido por el Mike Ounsworth 29.07.2018 - 03:09
fuente

Lea otras preguntas en las etiquetas