Se un utente malintenzionato ha accesso solo al database "live" (più comunemente tramite SQL injection), quindi la crittografia dei campi utilizzando un segreto non archiviato nel database è sufficiente - anche qualche chiave segreta hard-coded nel codice dell'applicazione o file di configurazione. Non è necessario utilizzare le chiavi per client.
Se sei preoccupato che un utente malintenzionato possa in qualche modo accedere ai dati nella tua web root, ma non al resto del file system (in genere se il tuo server non è configurato correttamente per consentire la navigazione nel suo contenuto Web), non cambia nulla - dopotutto, il tuo server il codice o il file di configurazione dovrebbero trovarsi al di fuori della web root, giusto? (Ho poca esperienza con PHP, quindi potrei sbagliarmi)
Se la tua preoccupazione è che un utente malintenzionato si impadronisca dell'intero filesystem, devi assicurarti che la chiave esista solo nella RAM. Un modo per farlo sarebbe richiedere l'inserimento di una password all'avvio (re) del server e il mantenimento della chiave derivata in una variabile accessibile a livello globale (ancora una volta, non so se è possibile con PHP). Potrebbero esserci altre opzioni, ma qualsiasi cosa io possa pensare potrebbe introdurre altri punti di errore. [1]
I was thinking of generating the certificates on registration and use part of the footprint of a certificate to encrypt the user's data. so the SHA1 or MD5 footprint could do as key and IV.
L'utilizzo di qualsiasi cosa dal certificato è una cattiva idea, poiché i certificati sono per definizione public (le parti private non abbandonano mai la macchina dell'utente). Se in qualche modo potresti decodificare alcuni dati usando la sua chiave privata (qualcosa che AFAIK non è ampiamente supportato in questo momento, ma potrebbe essere in futuro ), lato client, quindi potresti essere all'altezza di qualcosa ... Ma come stanno le cose ora, potresti semplicemente creare una chiave casuale per ogni utente e avere il tuo codice applicazione leggerlo (da un luogo sicuro) e applicarlo ai dati dell'utente prima di inserirli / emetterli.
Questo, ovviamente, presuppone che sia necessario isolare i dati di un utente dagli altri utenti. Se questo non è il caso, una singola chiave globale potrebbe essere sufficiente, come descritto nella prima parte di questa risposta.
(un'ultima nota: non hai menzionato il metodo che intendi utilizzare per crittografare i dati. Se utilizzi una codifica di streaming, ad esempio, avere una singola IV per ciascun utente non è sufficiente - devi avere uno diverso per ogni dato che si desidera proteggere. Non importa però come li memorizzi, dal momento che non dovrebbero essere riservati, solo unici . Ci sono modi per creare una singola IV utilizzabile per crittografare un sacco di dati , ma questo è al di là delle mie attuali conoscenze, quindi non farò un'opinione su di loro.)
[1]: solo per citarne uno, è possibile ricavare una chiave di crittografia dalla password dell'utente, memorizzarla in un cookie di sessione (sicuro) e passarla avanti e indietro dal server al client. Dal momento che non è memorizzato da nessuna parte, un utente malintenzionato non potrà accedervi anche se ha ottenuto l'accesso all'intero server (presupponendo ovviamente il tuo sito correttamente password salts and hashes e la chiave di autenticazione e la chiave di crittografia sono indipendenti l'uno dall'altro ) . Per alcuni approfondimenti sulla difesa, potresti persino combinare quella chiave con una memorizzata solo nel server. Lo svantaggio evidente è che parte della sicurezza del sistema dipende ora dal browser dell'utente e anche dal modo in cui i cookie di sessione vengono gestiti sia nel server che nel client.