Come gestire la crittografia / decodifica di chiavi private per l'applicazione web

2

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.

    
posta josh 26.05.2014 - 02:25
fonte

1 risposta

2

Non ci sono limiti particolari sulla sicurezza della crittografia in JavaScript; un'implementazione di JavaScript è probabilmente più lenta di un'implementazione di codice nativo, ma sarà quasi sicuramente abbastanza veloce per i tuoi scopi. Tuttavia, il vero problema è che indipendentemente dal fatto che la crittografia avvenga sul server o sul client, gli utenti devono ancora fidarsi di te, dato che le app Web sono particolarmente soggette a manomissioni e non consentono una facile verifica da parte dell'utente del codice sorgente . Pertanto, un'applicazione web per la gestione dei portafogli bitcoin è semplicemente una cattiva idea. Qualsiasi utente del tuo sito web dovrebbe fidarsi di te e di tutte le autorità di certificazione fidate dai loro browser, con i loro bitcoin. Dato che le banche bitcoin hanno un track record di perdita / furto dei bitcoin dei loro utenti, è improbabile che gli utenti si fidino del tuo sito web.

Vedi anche "Cryptography Javascript Considerato Nocivo": link

    
risposta data 26.05.2014 - 23:58
fonte

Leggi altre domande sui tag