All'inizio di quest'anno, mi è stato chiesto di valutare l'utilizzo di JavaScript per crittografare le informazioni sensibili nel browser dell'utente prima di inviarlo al nostro server. Mentre la mia prima risposta è stata "chiedi a un esperto", il mio capo è stato irremovibile, quindi sono andato avanti e ho ricercato le opinioni degli esperti sull'argomento nel modo migliore possibile. Sulla base di questa ricerca sono tornato da lui con un clamoroso "nessun esperto pensa che sia una buona idea" ed è stato in grado di convincerlo, ma non sono stato in grado di rispondere in modo specifico ad alcune delle sue confidenze per RAGIONI è stata una cattiva idea. Nello specifico, i motivi principali che ho trovato per la crittografia JavaScript in-browser sono i seguenti:
- Basta usare TLS in primo luogo, è sicuro al 100% di essere migliore
- JavaScript non offre PRNG crittograficamente sicuro
- Ogni utente malintenzionato di Man-In-The-Middle dovrebbe semplicemente modificare il codice di crittografia, rendendolo inutilizzabile
Tuttavia, il caso d'uso specifico che stavo indagando mitigava quelli:
- Stavamo già progettando di applicare TLS, con la parte JavaScript destinata esclusivamente a coprire le future vulnerabilità TLS
- Generheremmo una coppia di chiavi RSA altrove e invieremo la chiave pubblica con il codice di crittografia, piuttosto che richiedere al client di generare o inviare le chiavi del proprio
- Sebbene non protegga da un utente malintenzionato che potrebbe modificare il nostro javascript, potremmo comunque proteggere da vulnerabilità che consentono solo i messaggi di LETTURA
Non sono stato in grado di trovare una vera risposta all'ultimo argomento in particolare, e potevo solo ricorrere a "un consenso schiacciante". Posso pensare ad alcuni argomenti POSSIBILI, ma non sono stato in grado di supportarli definitivamente:
- La crittografia all'interno di TLS non aggiunge alcun valore al primo posto
- Le vulnerabilità di sola lettura in TLS non sono realistiche, qualsiasi crack potrebbe anche consentire modifiche anche
- Anche senza modificare il codice di crittografia originale, un utente malintenzionato potrebbe inserire JavaScript in un modo diverso e impedire la crittografia in questo modo
- Potrebbe aggiungere una modesta quantità di sicurezza, ma lo sforzo e le conoscenze necessarie per crearlo e mantenerlo sarebbero proibitivi
TL; DR: Gli argomenti principali che ho visto contro la crittografia JavaScript sono 1) uso TLS invece e 2) JavaScript non genera chiavi sicure. Se viene utilizzato anche TLS e le chiavi vengono generate altrove, la crittografia JavaScript inizia ad aggiungere valore? '
Nota: in risposta a un paio di commenti, il caso d'uso qui NON è crittografia end-to-end; il server deve, almeno in alcune situazioni, leggere i dati originali.