Vorrei innanzitutto dire che so che è una pessima idea memorizzare informazioni sensibili in un database mysql, quindi per favore non rispondere dicendo "DO DO DO IT" o qualcosa del genere effetto. Sto costruendo un sito web per il quale è assolutamente essenziale per memorizzare i numeri di previdenza sociale, e devo essere in grado di recuperare tali dati dal DB (nessun hashing).
Detto questo, ho cercato il modo migliore per crittografare / decrittografare i dati e creare una funzione personalizzata per gestire la crittografia. Ecco la mia funzione di crittografia:
function my_data_encrypt($value){
$salt=substr(uniqid('', true), 0, 20);
$key=$salt.MY_PRIVATE_KEY;
$enc_value=base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $value, MCRYPT_MODE_CBC, md5(md5($key))));
return array("enc_value"=>$enc_value, "salt"=>$salt);
}
Quindi fondamentalmente sto generando una stringa casuale per il mio sale, quindi accodando al sale una chiave privata MY_PRIVATE_KEY
che è definita in un file di configurazione separato. Quindi utilizzo mcrypt_encrypt
per crittografare i dati, quindi base64_encode
per rendere sicura la crittografia da memorizzare nel DB. La stringa crittografata e il sale univoco vengono quindi restituiti e archiviati nel DB insieme.
Pensavo che lanciando una "chiave privata" che è stata memorizzata nel file di configurazione (non nel DB) nel mix avrebbe aggiunto un altro livello di sicurezza alla crittografia, in questo modo anche se qualcuno ha hackerato il database e ottenuto la crittografia valore e il sale, non avrebbero ancora tutto ciò di cui hanno bisogno per decodificare i dati.
Può gli esperti di sicurezza riesaminare la mia funzione e farmi sapere se / come i miei dati potrebbero essere violati e se c'è qualcos'altro che potrei fare per migliorarlo?