Consigli sull'utilizzo della crittografia per l'app di auto allenamento

2

Sono un autodidatta sull'uso della crittografia. Sono uno sviluppatore php e nel tempo libero sto costruendo un'app online che fornisce funzionalità di base cms per aiutarmi a capire meglio il design della crittografia. Sto usando la crittografia per proteggere i dati se rubati e averli accessibili al pubblico come quello che è successo ad adobe.

Le mie restrizioni per questa app sono:

  1. Gli utenti finali useranno questa app e non ci si può fidare che ricordino la propria password in ogni momento, quindi la loro password non può essere utilizzata nel processo di crittografia poiché ci sarà un'alta probabilità che essi debbano reimpostare la password a qualche fase.

  2. Non può permettersi il software di gestione delle chiavi del fornitore o hsm.

  3. Non è possibile caricare utenti in una chiave durante l'accesso a cms per crittografare o decrittografare i dati durante la sessione. In effetti, gli utenti non avranno accesso alle chiavi utilizzate in quanto non possono essere considerate attendibili per mantenere le chiavi al sicuro. Inoltre gli utenti esterni come gli appaltatori avranno accesso a cms. Quindi tutte le chiavi gestite dall'app sotto le copertine.

I dati saranno archiviati in un db criptato. Il codice crittograferà i dati poiché non sto utilizzando la crittografia nativa di mysql.

I dati verranno crittografati utilizzando una chiave simmetrica.

La chiave simmetrica verrà archiviata su un altro server disattivato e accessibile solo tramite cms ip. Il cms quando ha bisogno di una particolare chiave simmetrica chiamerà il server che memorizza le chiavi simmetriche e passa un valore di hash che verrà usato per cercare la chiave simmetrica corretta. Quando si trova la chiave, invierà la chiave al cms e il cms memorizzerà la chiave in memcached.

Ora pensavo che avrei dovuto proteggere le chiavi simmetriche, quindi quello che pensavo dovessi fare è crittografare le chiavi simmetriche con la chiave pubblica asimmetrica e memorizzare la chiave simmetrica crittografata in un db sul server non cms, quindi quando il cms diventa la chiave utilizza la chiave privata memorizzata sul server cms per decrittografarla.

Yesh!

È come pollo / uovo!

Mi stavo chiedendo se qualcuno può darmi qualche indicazione su come farlo correttamente. Il mio obiettivo per questo progetto è proteggere i dati se il db viene rubato.

Penso che sia sbagliato memorizzare la chiave privata sul server cms perché se anche il server non cms che memorizza le chiavi simmetriche utilizzate per crittografare i dati viene violato anche tutte le chiavi sono disponibili.

L'app controllerà anche gli input per i tentativi di iniezione, Xss, usando la whitelist degli ip per accedere ai cms, crittografare i cookie di sessione, pulire i dati di input e altri fondamentali di sicurezza di base.

    
posta user35032 04.12.2013 - 11:32
fonte

1 risposta

4

Benvenuto in security.se e nella gestione delle chiavi!

La memorizzazione delle chiavi è sempre il problema più grande con la crittografia lato server: da un lato, è necessario un accesso semplice e trasparente alla chiave da parte dell'applicazione e dall'altra parte, è necessario proteggere i dati da qualsiasi accesso non autorizzato.

La solita risposta a questo è usare un modulo di sicurezza hardware (HSM). Questo tipo di dispositivo hardware (che va da un semplice dispositivo simile a una chiavetta USB a sistemi montati su rack) dispone di un'archiviazione speciale a prova di manomissione per la chiave stessa e gestirà tutte le operazioni di crittografia utilizzando questi tasti (decrittografia e firma digitale, crittografia e la convalida può essere eseguita all'esterno del dispositivo poiché non è necessario accedere alle chiavi private).

Utilizzando questo approccio, supponendo di aver implementato correttamente la crittografia, si limita il modo in cui i dati possono essere trapelati: anche se qualcuno ottiene un dump del database, non otterrà l'accesso ai dati in chiaro a meno che non rubi fisicamente l'HSM (che è più facile da proteggere).

Tuttavia, questo tipo di installazione è molto difficile da implementare correttamente ed efficientemente. Mentre in teoria è abbastanza sicuro, spesso è ancora possibile catturare dati in chiaro o anche chiavi di crittografia simmetriche (se si è utilizzato l'HSM per accedere a queste chiavi) dalla memoria del processo. I linguaggi moderni e di alto livello come PHP, Java e C # sono particolarmente inclini a conservare quel tipo di informazioni sensibili in memoria per un lungo periodo di tempo poiché non c'è modo di azzerare e liberare memoria in modo esplicito (e anche se lo fai, spesso una traccia lasciata nel file di paging).

Inoltre, sei ancora aperto a qualsiasi tipo di iniezione di codice che garantisca l'accesso ai tuoi dati dopo che è stato decodificato (ad esempio, se usi crittografia trasparente dei dati , non proteggerà i tuoi dati da alcun tipo di iniezione SQL nel tuo programma).

    
risposta data 04.12.2013 - 12:15
fonte

Leggi altre domande sui tag