L'attività potrebbe non essere risolvibile in una formulazione così ampia come nel titolo, ma questo è il mio scenario (che è in qualche modo simile ad esempio per iscrizioni alla newsletter e quindi sicuramente è già stato pensato)
Voglio implementare un database su un server web in cui sono archiviati dati privati sugli utenti. Gli utenti non dovrebbero avere un nome di accesso di fantasia, invece devono essere "validati via email", cioè, l'accesso a una casella di posta dovrebbe essere sufficiente per l'autenticazione.
Gli utenti dovrebbero essere in grado di creare, aggiornare, eliminare solo i propri dati. L'amministrazione centrale dovrebbe essere in grado di esportare i dati dal server Web a un host protetto.
Lo scenario di attacco è che il server Web insieme a tutti i dati su di esso (compresi gli script di pagine Web e il database) viene compromesso. Il requisito è che i dati privati memorizzati lì prima il compromesso rimangano protetti (supponendo che non venga tentato nessun altro accesso utente).
Ecco le mie idee finora: per l'autenticazione ho solo gli utenti email
.
- Un nuovo inserisce il suo
email
in un modulo, che causahash(email)
+publicencrypt(email)
+random nonce
+timestamp
da memorizzare che rappresenta l'utente e all'utente viene inviata una mail contenente un URL con parametrirandom nonce
eemail
. (Dato che c'è solo (protetto)email
e non (non protetto)username
più (protetto)password
, cose come il sale non possono essere usate e devo ricorrere ahash(email)
, no?). - Lo stesso accade con un utente esistente, in cui solo
hash(email)
sarà uguale a qualsiasi tentativo precedente.publicencrypt(email)
,random nonce
etimestamp
differiranno. - Chiunque acceda a un URL con i parametri
email
enonce
come generato sopra può eseguire operazioni sul record del database corrispondente dopo aver controllato: Esiste un record conhash(email)
corrispondente enonce
corrispondente e non troppo vecchio% codice%? Se sì, l'utente può procedere. Nota che durante la sessione web di questo utente, è disponibile il testo trasparentetimestamp
. - L'esportazione nell'host di amministrazione centrale protetta avviene esportando i dati crittografati così come sono. La decifratura avviene con la chiave privata che corrisponde alla chiave pubblica utilizzata per crittografare (quest'ultima è considerata pubblica perché risiede sul server compromissibile).
L'aggiunta di una nuova voce è completata a questo punto, aggiungendo un flag email
al record. Cancellare il record è ovviamente facile. La visualizzazione di dati non riservati (ad esempio, quando è stata creata o modificata la voce) è anche un'attività banale.
Il mio problema è: come gestire in modo sicuro ulteriori dati privati?
Potrei semplicemente archiviarlo in forma crittografata (come l'e-mail), ma in quel caso il contenuto non può nemmeno essere mostrato all'utente autenticato. Potrebbe cambiarlo, ma non può decifrarlo in una sessione web successiva. Questo è ovviamente sub-ottimale.
La mia unica idea è di crittografare i dati aggiuntivi con una chiave diversa: invece della chiave pubblica di una coppia di chiavi asimmetriche usa una chiave simmetrica che è riproducibile prodotta da isValid
, cioè memorizza dati aggiuntivi come %codice%. Poiché il testo in chiaro email
è disponibile all'utente stesso durante la sua sessione Web, nonché nell'esportazione decrittografata sull'host protetto, symmetricencrypt(data,key_generated_from(email))
può essere ricostruito.
Vedo i seguenti problemi:
- Dato il formato limitato degli indirizzi email (ad esempio, alcuni domini possono verificarsi molto spesso), una chiave generata dall'e-mail come descritto sopra potrebbe essere sufficientemente sicura?
- In realtà, dato il formato limitato degli indirizzi e-mail, è il
email
che ho usato nel concetto di base che protegge solo l'e-mail abbastanza bene? (C'è abbastanza entropia negli indirizzi email, per così dire?) - C'è un approccio migliore?