Supponiamo di disporre di un server di archiviazione dannoso (un archivio di valori-chiave indipendente dall'utente, che supporta server.put(key, value)
e server.get(key)
) che vogliamo utilizzare per l'archiviazione sicura di file per utente. Le due interfacce che voglio rendere sicure sono client.upload(username, filename, message)
e client.download(username, filename)
, che comunicano con server.put()
e server.get()
dietro la scena.
Ipotesi:
- Ogni utente ha le proprie chiavi private archiviate in modo sicuro a livello locale e le chiavi pubbliche archiviate su un server con chiave pubblica protetta.
- Il server dannoso potrebbe tentare di manomettere il messaggio caricato.
- Il server dannoso può far caricare un file arbitrario dall'utente con qualsiasi nome e contenuto che desidera.
- Il server dannoso non eseguirà il rollback di un file o lo eliminerà.
- I nomi di file e i contenuti dei file non sono vuoti.
Requisiti:
- Le lunghezze dei nomi di file e del contenuto non devono essere confidenziali (ad esempio, il server dannoso non farà caricare un utente su due file con lunghezze diverse e prova a indovinare quale file / ha caricato).
- I nomi file e i file stessi devono essere riservati.
- Il client deve rifiutare qualsiasi file che è stato manomesso o non caricato dall'utente specificato. (Ie, integrità e autenticazione).
Il design a cui sto pensando è:
- Chiave (da utilizzare con il server di archiviazione) =
encrypt(filename, priv_key_1)
- Valore =
signed(encrypt(message, priv_key_1), priv_key_2)
C'è qualche difetto in questo design?