Sto lavorando a un'app in cui desidero fornire la crittografia end-to-end sui file, in cui più utenti sono in grado di accedere a tali cartelle. Mi piacerebbe che la crittografia fosse il più trasparente e senza attrito possibile (non voglio che gli utenti debbano gestire le proprie chiavi), quindi ho preso in considerazione modi per farlo.
I requisiti per questo protocollo sono:
- Gli utenti non devono gestire la propria chiave
- Gli utenti devono poterlo utilizzare da più dispositivi
- Durante la modifica del dispositivo, gli utenti devono comunque avere accesso ai loro vecchi file
I miei pensieri correnti sono:
- Quando un utente si registra, genera una coppia di chiavi (lato client)
- Cripta la loro chiave privata con una chiave simmetrica derivata da salt + password (lato client)
- carica la chiave pubblica, la chiave privata crittografata,
hash(salt + password)
e sale sull'API - Lato server, archivia la chiave pubblica e la chiave privata crittografata. Poiché la password dell'utente viene utilizzata per crittografare la propria chiave privata, non può mai essere trasmessa in chiaro al server. Se, invece, viene trasmesso un hash, la loro password non viene rivelata ma se un utente malintenzionato dovesse violare il database, sarebbe possibile utilizzare l'hash per accedere al proprio account, ma non decrittografare i file. Per risolvere questo problema, l'hash della password trasmessa viene rehashed lato server e memorizzato.
- Quando un utente crea una cartella, genera una nuova chiave simmetrica e cripta questi file usando quella chiave (lato client)
- Cifra questa chiave simmetrica usando la chiave pubblica degli utenti (lato client)
- Quando l'utente esegue l'accesso, scarica la sua chiave privata pubblica e crittografata
- Decrittografa la chiave privata, memorizza sul dispositivo
- Utilizza la chiave privata per decrittografare la chiave simmetrica, quindi decrittografare i file
- Per garantire l'accesso alla cartella di proprietà di A a un altro utente B, l'utente A recupera la chiave pubblica per l'utente B dall'API, decodifica la chiave simmetrica della cartella utilizzando la propria chiave privata, quindi crittografa nuovamente la chiave simmetrica utilizzando la chiave pubblica di B, prima di trasmetterlo all'API. L'utente B può quindi recuperare la chiave simmetrica crittografata, decodificarla utilizzando la sua chiave privata e decodificare il contenuto della cartella
Un approccio del genere ha senso (dal punto di vista della sicurezza e dell'usabilità)? Ci sono avvertenze o potenziali insidie?
Capisco che ci siano protocolli N volte per la crittografia asimmetrica multipartitativa, tuttavia poiché i file piuttosto che i messaggi memorizzati non è realistico dal punto di vista dell'ampiezza di banda.