Ho sviluppato un'applicazione web (sviluppata in .NET MVC 4) che ha più utenti con credenziali di accesso personali. L'applicazione web contiene molti contenuti caricati dagli utenti.
Il mio cliente vorrebbe anche avere una versione offline dell'applicazione, per Windows. Questa applicazione dovrebbe utilizzare le stesse informazioni disponibili sul Web, dovrebbe essere disponibile offline e dovrebbe essere protetta in modo che un utente non possa essere in grado di prendere il contenuto dell'applicazione e darlo / venderlo a un concorrente (in un modo semplice).
Quindi ho implementato nella mia applicazione web la funzionalità per creare un pacchetto di applicazioni, contenente tutte le informazioni rilevanti, che è scaricabile e crittografato con una chiave simmetrica. Tuttavia, ogni utente dovrebbe essere in grado di decifrare il pacchetto con le sue credenziali (ad esempio le password personali).
Quindi, quando viene creato un utente, creo una coppia di chiavi asimmetriche per quell'utente e la chiave privata viene archiviata nel database come una stringa crittografata in cui la chiave è la password privata (memorizzata come hash da bcrypt).
Questo elenco di eventi significa che c'è un bel po 'di crittografia annidata e mi fa sentire a disagio perché non so davvero se è abbastanza sicuro - quindi vorrei alcuni input sul mio metodo di scelta.
La catena di funzionalità;
Durante la creazione di un utente;
- Crea una coppia di chiavi asimmetriche
- Cripta la chiave privata con la password delle credenziali degli utenti
- Hash la password con bcrypt
- Store hash + chiave privata crittografata per l'utente
Durante la creazione di un pacchetto di applicazione;
- Crea una chiave simmetrica [Lato server]
- Crea un pacchetto di applicazioni (dati grezzi) e crittografalo con tasto simmetrico [lato server]
- Per ogni utente, crittografare la chiave simmetrica con la chiave pubblica dell'utente e memorizza il risultato in modo che possa essere scaricato [Lato server]
- Un utente accede per scaricare il pacchetto + simmetrico crittografato chiave + chiave privata crittografata [lato server]
- Decrittografa la chiave privata, crittografata, memorizzata con le credenziali dell'utente password [lato client]
- Decrittografa la chiave memorizzata, crittografata, simmetrica con l'ora decrittografata chiave privata per l'utente [lato client]
- Decifra il pacchetto dell'applicazione (in memoria sul computer client) e mostra il contenuto tramite un piccolo server integrato [lato client]
Questo è un modo abbastanza sicuro per risolvere il mio problema? Posso farlo in altro modo? C'è qualche evidente lacuna di sicurezza in questa soluzione?