Crittografia di dati sensibili nel software e memorizzazione / decrittografia su un server

8

Ho cercato la sicurezza IT e Google per qualcosa di simile a questo, ma non sono riuscito a trovare nulla collegato in remoto a quello che sto facendo.

Sto sviluppando un software con 2 parti: un programma C # eseguito su un singolo computer sicuro e affidabile e un software PHP in esecuzione su un server. Questo sistema tratta i dati sensibili, vale a dire i record di farmacia (non negli Stati Uniti, HIPPAA non si applica).

Desidero crittografare in modo sicuro i dati, in modo che anche nel caso in cui il database venga rubato, è possibile decodificare il meno possibile i dati. Sto già proteggendo i dati non memorizzando dati identificabili come Nome, Indirizzo ecc., Salvo per un indirizzo email.

Inizialmente volevo utilizzare una variante su questa soluzione , tuttavia in ulteriore contemplazione mi sono reso conto che RSA non era un modo appropriato per crittografare il testo in chiaro direttamente. La mia ricerca mi ha portato a credere che AES sia l'algoritmo più appropriato per questo. So che il consiglio dato alla maggior parte delle persone che non sono esperti di crittografia è quello di seguire un protocollo standard del settore, tuttavia non sono riuscito a trovarne uno che corrispondesse ai miei criteri.

I criteri sono:

  • Per i dati di ciascun utente, solo l'utente stesso dovrebbe essere matematicamente in grado di accedere ai propri dati in base al contenuto del server - il che significa che viene utilizzata una chiave derivata dalla sua password (il software C # ha pieno accesso ai dati di tutti gli utenti, può avere accesso ai tasti)
  • La decrittografia non dovrebbe essere possibile dopo aver ottenuto solo il contenuto del server
  • I dati di testo normale non dovrebbero mai essere memorizzati sul server (quindi voglio crittografare nel software C #)
  • I dati devono poter essere crittografati senza che l'utente sia disponibile a fornire la sua password
  • I dati saranno decodificati e letti in PHP - nessun nuovo dato o dati modificati dovranno essere nuovamente crittografati e scritti
  • È possibile memorizzare o accedere solo a un hash della password dell'utente

Ecco una soluzione che ho trovato:

Naturalmente, tutte le connessioni vengono effettuate tramite TLS / SSL (su HTTPS). Prima di trasferire dati sensibili, il server e il software sono "innescati" o associati. Una coppia di chiavi asimmetriche viene generata sul server e la chiave privata trasferita al software (mi riferisco al componente C # come "il software"). La chiave privata viene cancellata dal server e la chiave pubblica memorizzata.

Quando un utente si registra, la sua password viene utilizzata per generare una chiave a 128 bit utilizzando PBKDF2. Questa chiave è crittografata con RSA utilizzando la chiave pubblica precedentemente generata e memorizzata.

Quando i dati vengono caricati dal software sul server (ogni 24 ore), il software invia una lista di ID utente per i quali caricherà i dati (oltre HTTPS ovviamente). Il server restituisce un elenco delle chiavi a 128 bit crittografate con RSA insieme agli id utente corrispondenti. Il software li decodifica uno per uno usando la sua chiave privata, ottenendo un elenco di chiavi a 128 bit. Per ciascun utente, il server acquisisce i dati dell'utente e li crittografa con AES-128 utilizzando la chiave corrispondente dell'utente. L'intero carico utile viene caricato sul server e salvato direttamente.

Quando un utente effettua l'accesso, la sua password è accessibile per un breve periodo e PBKDF2 viene utilizzato per generare la chiave AES-128. Per impedire loro di reinserire la propria password su ogni pagina caricata, la chiave AES-128 viene memorizzata in un cookie sicuro sul proprio computer con una breve scadenza (5-10 minuti) e utilizzata nei successivi carichi di pagina per decodificare e visualizzare i dati di quell'utente. In realtà non è memorizzato sul server.

Questo protocollo di sicurezza è appropriato? Dovrei modificarlo? C'è qualcosa che è standard del settore e funzionerebbe qui? Qualsiasi aiuto sarebbe molto apprezzato.

    
posta Matt Jadczak 28.02.2013 - 00:18
fonte

1 risposta

5

L'implementazione del tuo protocollo è difficile . Avrai facilmente qualcosa che funziona più o meno, ma ottenere qualcosa che sia sicuro richiederà molto lavoro e anche una notevole quantità di fortuna.

Dai tuoi requisiti, ti piacerebbe un protocollo che assomigli a questo:

  • Ogni utente ha una coppia di chiavi asimmetriche, adatta per la crittografia (ad esempio, RSA o ElGamal).
  • La chiave privata K priv è crittografata con una chiave simmetrica K derivata dalla password dell'utente e quindi memorizzata sul server.
  • La chiave pubblica K pub è archiviata sul server senza crittografia (è public ).
  • Gli elementi dei dati sono crittografati con K pub . Chiunque può crittografare qualsiasi cosa con una chiave pubblica (questo è il punto in cui la chiave pubblica è pubblica).
  • Per decodificare i dati, l'utente digita la sua password, che viene utilizzata per ricalcolare K , quindi decrittografare il blob che contiene K priv . Con questa chiave privata asimmetrica, l'utente può decodificare tutti i file di dati che sono stati crittografati con la chiave pubblica corrispondente.

Il formato OpenPGP contiene tutti i primitivi necessari per questo. BouncyCastle è una libreria opensource che può utilizzare tale formato e come versione C # /. NET.

    
risposta data 28.02.2013 - 18:00
fonte