Primero, permítame decir que Sé que es una mala idea almacenar información confidencial en una base de datos mysql, así que no responda diciendo "NO LO HAGA" o algo así. efecto. Estoy construyendo un sitio web para el que es absolutamente esencial almacenar números de Seguro Social, y tengo que poder recuperar esos datos de la base de datos (sin hashing).
Dicho esto, he investigado la mejor manera de cifrar / descifrar los datos y he creado una función personalizada para manejar el cifrado. Aquí está mi función de cifrado:
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);
}
Básicamente, estoy generando una cadena aleatoria para mi sal, y luego agregando a la sal una clave privada MY_PRIVATE_KEY
que se define en un archivo de configuración independiente. Luego uso mcrypt_encrypt
para cifrar los datos, luego base64_encode
para hacer que el cifrado sea seguro para almacenar en la base de datos. La cadena cifrada y la sal única se devuelven y almacenan en la base de datos juntos.
Mi pensamiento fue que agregar una "clave privada" que se almacena en el archivo de configuración (no en la base de datos) en la mezcla agregaría otro nivel de seguridad al cifrado, de esa manera incluso si alguien piratea la base de datos y obtiene el cifrado valor y la sal, todavía no tendrían todo lo que necesitan para descifrar los datos.
¿Pueden los expertos en seguridad revisar mi función y hacerme saber si / cómo mis datos pueden ser pirateados y si hay algo más que pueda hacer para mejorarlos?