Non so se ha molto senso crittografare i dati con l'hash della password dell'utente, soprattutto se mantieni l'hash stesso nel database. In tal caso chiunque possa accedere ai dati crittografati può anche accedere all'hash della password e decrittografare i dati.
Un altro approccio sarebbe crittografare i dati con la chiave specifica dell'applicazione con alcuni dati specifici dell'utente. Tuttavia, devi affrontare un altro problema:come archiviare in modo sicuro la chiave dell'applicazione. A questa domanda non conosco una risposta facile, ma tenerlo nel codice sorgente è probabilmente abbastanza buono se temi che i dati del tuo database possano essere compromessi, ma non il codice sorgente stesso, ad es. se il tuo database è archiviato fuori sede (pensa ad Amazon S3).
Saltare la chiave dell'app con la password dell'utente aiuta se mantieni solo l'hash della password nel database, ma può introdurre un altro difetto di sicurezza:devi mantenere la password dell'utente in chiaro nella sessione dell'applicazione.
Per quanto riguarda la soluzione tecnica, è abbastanza semplice e è disponibile un codice di esempio . Puoi modificarlo come segue per crittografare i dati con la password dell'applicazione salata con hash password:
INSERT INTO secure_table VALUES (
1,
AES_ENCRYPT(
'plain text data',
CONCAT(@application_password, @user_password))
);
In ogni caso dovresti memorizzare la password dell'applicazione da qualche parte, quindi non credo che ci sia un approccio semplice che fornisca una sicurezza perfetta.
Un altro approccio che mi viene in mente è chiedere all'utente un PIN breve che potresti usare come chiave di crittografia. Il PIN non verrebbe memorizzato nel database, ma dovresti chiederlo all'utente ogni volta che accedi ai suoi dati.
E ovviamente devi pensare alla fattibilità della crittografia. Non sarai in grado di indicizzarlo o cercarlo senza decrittografarlo. Probabilmente è richiesto per un insieme limitato di dati (ad es. numero di carta di credito), ma non andrei molto lontano.