WebCrypto
I problemi con la crittografia nel javascript lato client (browser) sono dettagliati di seguito. Tutte queste preoccupazioni, tranne una, non si applicano all'API WebCrypto , che ora è ragionevolmente ben supportata .
Per un'app offline, è comunque necessario progettare e implementare un keystore sicuro.
A parte: se si utilizza Node.js, utilizzare l' API crittografica integrata.
Crittografia nativa-Javascript (pre-WebCrypto)
Presumo che la preoccupazione principale sia che qualcuno abbia accesso fisico al computer che sta leggendo localStorage
per il tuo sito e desideri che la crittografia aiuti a impedire tale accesso.
Se qualcuno ha accesso fisico sei anche aperto ad attacchi diversi e peggiori della lettura. Questi includono (ma non sono limitati a): keylogger, modifica di script offline, iniezione di script locale, avvelenamento da cache del browser e reindirizzamenti DNS. Tali attacchi funzionano solo se l'utente utilizza la macchina dopo che è stata compromessa. Tuttavia, l'accesso fisico in tale scenario significa che hai problemi più grandi.
Quindi tieni presente che lo scenario limitato in cui la crittografia locale è preziosa sarebbe se la macchina viene rubata.
Esistono librerie che implementano la funzionalità desiderata, ad esempio Stanford Javascript Crypto Library . Ci sono debolezze intrinseche, tuttavia (come indicato nel collegamento dalla risposta di @ ircmaxell):
- Mancanza di entropia / generazione di numeri casuali;
- La mancanza di un keystore sicuro, ovvero la chiave privata deve essere protetta da password se memorizzata localmente o memorizzata sul server (che impedisce l'accesso offline);
- Mancanza di cancellazione sicura;
- Mancanza di caratteristiche di temporizzazione.
Ognuna di queste debolezze corrisponde a una categoria di compromesso crittografico. In altre parole, mentre potresti avere "cripto" per nome, sarà molto al di sotto del rigore a cui aspiri nella pratica.
Detto questo, la valutazione attuariale non è così banale come "La crittografia Javascript è debole, non usarla". Questa non è un'approvazione, rigorosamente un avvertimento e richiede di comprendere completamente l'esposizione dei punti deboli di cui sopra, la frequenza e il costo dei vettori che affronti e la tua capacità di mitigazione o assicurazione in caso di fallimento: Javascript crypto, in nonostante i suoi punti deboli, può ridurre la tua esposizione ma solo contro i ladri con capacità tecnica limitata. Tuttavia, dovresti presumere che la crittografia Javascript non abbia alcun valore nei confronti di un aggressore determinato e capace che prende di mira tali informazioni. Alcuni considererebbero fuorviante chiamare i dati "crittografati" quando sono noti così tanti punti deboli inerenti all'implementazione. In altre parole, puoi ridurre marginalmente la tua esposizione tecnica ma aumenti la tua esposizione finanziaria dalla divulgazione. Naturalmente, ogni situazione è diversa e l'analisi della riduzione dell'esposizione tecnica all'esposizione finanziaria non è banale. Ecco un'analogia illustrativa:Alcune banche richiedono password deboli , nonostante il rischio intrinseco, poiché la loro esposizione a perdite dovute a password deboli è inferiore ai costi dell'utente finale per il supporto di password complesse.
🔥 Se leggi l'ultimo paragrafo e pensi "Qualcuno su Internet di nome Brian dice che posso usare Javascript crittografato", non usare Javascript crittografico.
Per il caso d'uso descritto nella domanda sembrerebbe più sensato per gli utenti crittografare la propria partizione locale o directory home e utilizzare una password complessa. Questo tipo di sicurezza è generalmente ben collaudato, ampiamente affidabile e comunemente disponibile.