2011-09-23 19 views
9

in primo luogo, mi scuso se la mia domanda sembra poco confusionaria, farò del mio meglio per descrivere il mio scenario il più dettagliato possibile:Come memorizzare i dati utente privati ​​crittografati nel database, ma renderli disponibili ad altri utenti scelti?

Ho un sito web dove l'utente può inserire i propri dati personali su se stessi. Sono principalmente dati sanitari, quindi sono informazioni molto riservate e sensibili. Quindi ho bisogno di crittografare questi dati sul server anche se il server è compromesso questi dati sono protetti perché saranno crittografati con la password di ciascun utente. Ovviamente, le password degli utenti non verranno archiviate come testo di tipo chiaro sul server, ma solo gli hash delle password.

Ma il mio problema è che il sito web offrirà "funzione social" quando l'utente può scegliere di condividere alcune delle sue informazioni con un altro utente. Ma questo sarebbe un problema, perché non avrò modo di decodificare i dati privati ​​degli utenti e quindi non posso mostrarlo a un altro utente.

Potete per favore darmi alcune opzioni, o almeno idee, come potrebbe essere risolto? Preferibilmente usando l'ambiente LAMP.

risposta

18

Questo può essere risolto utilizzando public-key cryptography:

  1. generare una coppia di chiavi pubblica/privata per ogni utente; e decrittografa sempre e solo temporaneamente la chiave privata con la password dell'utente.
  2. Per ogni elemento di dati, scegliere a caso un tasto (simmetrico) S e crittografare i dati d con esso. Store S (d).
  3. Encrypt S con la chiave pubblica P + u dell'utente a cui si desidera concedere l'accesso. Inizialmente, questo è l'utente u cui dati stai memorizzando.
  4. Negozio P + u (S) in modo permanente. Dimentica tutte le altre chiavi.

Ora, quando un utente u vuole condividere i dati con l'utente x, effettuare le seguenti operazioni:

  1. decifrare tasto P privata dell'utente - u con la password dell'utente
  2. Utilizzando la chiave privata, decifrare i dati memorizzati: P - u (P + u (S)) = S.
  3. Encrypt S con la chiave pubblica dell'utente che si voglio condividere le informazioni con.
  4. Conservare il P + x (S) in modo permanente. Dimentica tutte le altre chiavi.

Ora, quando un utente x vuole accedere ai dati, eseguire la seguente procedura:

  1. decifrare tasto P privata dell'utente - x con la password dell'utente.
  2. Trova P + x (S). (Se non è memorizzato, significa che nessuno ha condiviso i dati con l'utente povero x).
  3. utilizzando la chiave privata, decifrare i dati memorizzati: P - x (P + x (S)) = S.
  4. Utilizzando S, decifrare il S crittografato memorizzato (d): S (S (d)) = d.
+1

Grazie per la grande soluzione. Ho dovuto leggerlo 5 volte per digerirlo completamente, ma questo è esattamente quello che stavo cercando, grazie. – Frodik

+0

@Frodik Scusa, lo so che è complicato, e si potrebbe far sembrare più semplice tralasciando tutte le variabili, ma ciò renderebbe molto impreciso. A proposito, date un'occhiata al modulo ['openssl'] (http://php.net/manual/en/book.openssl.php) per l'implementazione * * di questa soluzione. – phihag

+0

Grazie ancora per il tuo impegno. Potresti fornire un collegamento ad un semplice esempio o tutorial? Se no, sicuramente cercherò di farlo da solo, ma ho pensato che potresti avere qualcosa in tasca ;-) – Frodik

Problemi correlati