Sto lavorando a un'applicazione di gestione list multipiattaforma (JS / iOS / Android) che persiste i dati tramite un'API REST e voglio garantire che tutti i dati testuali siano correttamente crittografati sul lato client in modo che non ci sia modo di decifrare i dati sul lato server e nel caso sfortunato che il database venga rubato non vale la pena spendere alcuno sforzo per provare a decrittografarlo.
Molti mesi di ricerche e tentativi ed errori mi hanno portato a decidere che la crittografia AES in modalità operativa CBC è la scelta migliore a causa della sua forza e dell'adozione ampia su tutte le piattaforme. Ho deciso di eseguire la derivazione delle chiavi sulla base dell'algoritmo simile di OpenSSL in modo da avere uno strumento da riga di comando affidabile per testare l'accuratezza della mia implementazione.
L'unica cosa che rimane è quella di garantire in qualche modo la validità della frase di accesso di crittografia fornita dall'utente che non sarà mai diretta sul lato server. L'idea migliore che mi è venuta in mente finora è quella di decodificare diversi elementi dell'elenco dopo l'accesso per verificare se possono essere decodificati correttamente applicando l'hashing HMAC sul testo cifrato, che a sua volta richiede l'archiviazione dell'hash HMAC sul lato server. / p>
Ho un paio di domande:
- c'è un altro modo per garantire in modo sicuro la validità della passphrase fornita dopo un login riuscito?
- è sicuro riutilizzare la stessa passphrase nella crittografia AES CBC come chiave segreta nell'hash HMAC degli stessi dati crittografati?
Ho visto questo thread TLS ma io non hanno bisogno della crittografia tra un tipico setup client / server. Nel mio caso il client crittografa i dati, archivia nel cloud e la volta successiva o lo stesso client o un altro client lo decrittano. Quindi, le strette di mano e simili in TLS non hanno molto senso per me.
Nota 1: intenzionalmente la chiamo una "passphrase" sopra per enfatizzare che è diversa dalla password dell'utente che è convalidata all'accesso e che è memorizzata come hash all'interno dell'account utente.
Nota 2: in cima a tutto ciò, le richieste viaggeranno attraverso HTTPS. Il punto di cui sopra non è quello di garantire la sicurezza del trasporto, ma quello di limitare la leggibilità dei dati al lato client per numerosi vantaggi in termini di sicurezza.
Apprezzo qualsiasi feedback. Grazie!