Nel processo di progettazione di un'app Web che gestisce coppie di chiavi pubbliche / private - un'app Web di Bitcoin, in particolare - ho riflettuto molto su come gestire in modo sicuro l'archiviazione della chiave privata, poiché, utilizzando un analogia bancaria, se qualcuno ha accesso alla chiave privata Bitcoin di un utente, ha accesso a tutti i Bitcoin di quell'utente.
In tutti gli scenari la chiave privata verrà crittografata in un database il più sicuro possibile - nessun accesso diretto a Internet, privilegi espliciti di lettura / scrittura, ecc. - ma la parte che sto cercando di determinare e capire la soluzione migliore è l'inganno della chiave privata. Posso farlo sia dal lato client, cioè nel browser dell'utente o sul lato server.
Se lo faccio dal lato server, potrei assicurarmi che sia generato e crittografato in modo crittograficamente valido, ma se una persona malintenzionata accede al server, quella persona malata sarà in grado di accedere a qualsiasi chiave privata decodificata in memoria. Potrei inviarlo al browser per conservarlo nella sua memoria, ma poi questo può sollevare problemi di attacchi man-in-the-middle in grado di leggere la chiave privata in transito. Tutta la decrittazione / crittografia della chiave privata verrebbe eseguita sul server, anche quando viene generata la chiave privata.
Se lo faccio lato client, non dovrei preoccuparmi di una persona malintenzionata che riceve la chiave privata decodificata dal mio server come sarebbe decifrata nel browser, ma poiché la crittografia Javascript non è strong come altri metodi , le chiavi private crittografate potrebbero non essere altrettanto sicure nell'archiviazione e potrebbero essere più facilmente compromesse in caso di furto di dati.
In origine ero incline a fare la crittografia / decrittografia e la generazione di coppie di chiavi sul lato client, ma ora non ne sono così sicuro e sembra che entrambi abbiano delle valide preoccupazioni. Considerando lo stato del browser moderno e i suoi progressi nella crittografia Javascript, i vantaggi / rischi della crittografia / decrittografia nel browser sono migliori dei vantaggi / rischi di farlo sul server? Nota per questo scenario, si consideri solo che la chiave privata si trova solo sul server in memoria o nel browser in memoria / localStorage.