Background: ho poca conoscenza dell'hashing e della crittografia, quindi per favore portami con me. Ho postato una domanda correlata qui: link per la prospettiva di programmazione, che può dare qualche background. Quella domanda riguardava la fattibilità generale del prodotto complessivo. In un certo senso, questa domanda è un follow-up, sull'attuazione reale, ma poiché è più tecnico dal punto di vista della sicurezza, ho pensato che sarebbe stato meglio pubblicato qui. Sentiti libero di postare su entrambe le domande / entrambe le domande, a seconda dei casi.
Sono stato incaricato di proteggere i dati locali per un'applicazione web che può essere utilizzata offline, quindi l'interazione con il server per l'autenticazione e la crittografia non è un'opzione. Questo sarebbe facoltativo, per gli utenti che desiderano un ulteriore livello di protezione oltre alla crittografia hardware.
L'applicazione sarà per un singolo utente per dispositivo. L'obiettivo è provare a ridurre il rischio di accesso non autorizzato a dati sensibili se un dispositivo viene perso o rubato.
Le mie idee iniziali su come potrei fare questo sono:
- Richiede all'utente di inserire una password ogni volta che si avvia l'applicazione.
- Hash la password utilizzando PBKDF2, memorizzando l'hash e il sale localmente, ad es. in WebSQL.
- L'utente inserirà quindi la propria password, potrebbe essere re-hash utilizzando il sale caricato e confrontato con l'hash memorizzato.
- Memorizza la password in una variabile JavaScript localmente, magari usando un metodo di hashing diverso da quello che viene usato per archiviare nel database?
- Utilizzare questo come chiave per crittografare e decrittografare (utilizzando AES) i dati nel database.
I dati locali verranno crittografati, tuttavia la logica di crittografia / decrittografia sarà evidente dall'osservazione del codice sorgente JavaScript. Pertanto, la chiave utilizzata per crittografare / decodificare non può essere solo la password memorizzata, con hash, in quanto sarebbe ovvia.
D: In che modo questo approccio può essere migliorato? Sarebbe sufficiente inserire la password in due modi diversi, uno per la memorizzazione e uno per la crittografia / decrittografia? C'è qualcosa in più che potrei fare, tenendo presente i limiti del lavoro con lo storage web e senza un server / hardware esterno da assistere?
Inoltre - sebbene l'utente lavori offline con l'applicazione, quindi i dati devono essere locali e crittografati, ci sarà una connessione iniziale al server per scaricare effettivamente l'applicazione. Quindi, se c'è qualcosa che posso fare basandomi su quella connessione iniziale che potrebbe aiutarti, fammelo sapere.