mi piacerebbe per consentire agli utenti di creare domande e raccogliere informazioni da altri utenti in una web app personalizzato (PHP/MySQL in un ambiente di hosting puntellato) e proteggere i dati raccolti.
Background:
Le domande predefinite che tutti gli utenti rispondono sono abbastanza da non poter essere interpretati come dati personali (PII) in generale, limitando così la mia responsabilità per proteggerlo, ma gli utenti che creare il proprio le domande probabilmente richiederanno le PII che poi diventeranno una responsabilità.
Quello che mi piacerebbe fare è proteggere queste informazioni in modo tale che se l'account di hosting o il database fossero compromessi (o entrambi!), Le PII non sarebbero recuperabili senza una quantità significativa di lavoro, e persino quindi, solo una piccola parte sarebbe teoricamente recuperabile.
Soluzione proposta:
Supponendo built-in AES_ENCRYPT()/AES_DECRYPT()
funzioni sono utilizzate per cifrare il tavolo PII, la passphrase dovrebbe essere memorizzato nel account di hosting, quindi, se l'account di hosting sono stati compromessa, i dati di MySQL potrebbe essere facilmente letto.
Poiché le password degli utenti sono ben protette (hash con sale), sto pensando di acquisire la loro password in chiaro durante l'autenticazione, crittografandola e memorizzandola nella sessione PHP fino a quando l'utente non si disconnette.
Una combinazione di chiave pubblica/privata verrà creata per ciascun utente con la chiave privata protetta da password con la password dell'utente + sale.
Quindi, quando i dati PII basati sulle domande personalizzate dell'utente vengono aggiunti al DB, la chiave pubblica dell'utente viene utilizzata per crittografare le PII raccolte tramite l'app. Quando i dati vengono letti (solo quando l'utente ha effettuato l'accesso), i dati non vengono crittografati con la chiave privata dell'utente (che viene sbloccata con la password + sale).
I benefici che vedo sono:
- nella peggiore delle ipotesi, in cui i server completamente compromessi, codice di applicazione viene letto per trovare le chiavi di crittografia, i file di sessione PHP vengono decifrati per trovare le password degli utenti, poi le voci nella tabella PII associata a quell'utente vengono decifrati, quindi solo le PII raccolte dalle domande degli utenti attualmente connessi potrebbero essere ripristinate. Qualsiasi utente non connesso sarebbe sicuro.
- anche il DBA o simili non sono in grado di leggere le PII.
I svantaggi vedo sono:.
- password degli utenti sono memorizzati in una forma recuperabile mentre sono connessi in
- utenti che dimenticano la loro password sarebbe perdere l'accesso ai propri dati.
- ogni bit relativamente piccolo di dati occuperà molto più spazio nel DB a causa della crittografia.
La mia domanda: C'è un modo migliore per farlo?
È quasi impossibile garantire la protezione non appena il server viene compromesso. Non appena qualcuno ha accesso al codice php, può facilmente modificare il codice per scrivere tutte le password (o keypairs) in un file di testo in chiaro all'accesso. Non appena il sale è conosciuto (o noto come è costruito), l'hash non è risparmiato per la protezione. – Fge
Sì, finché la violazione non viene scoperta, è possibile acquisire le password. L'idea è contenimento e perdita minimizzata. Almeno alcuni dati sarebbero comunque protetti perché, si spera, la violazione verrebbe scoperta abbastanza rapidamente e non tutti gli utenti effettuerebbero il login entro quel periodo di tempo. –
Che cosa si desidera memorizzare esattamente nella sessione PHP? Non vedo perché hai bisogno di una chiave di crittografia aggiuntiva in memoria se decifri solo la chiave privata all'accesso. –