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.