Tropezó con el mayor problema con el cifrado de datos en la base de datos:
➽ ¿Dónde guardar la llave?
El cifrado no puede resolver el problema de proteger los datos, solo puede "concentrarlos" en una clave. Dondequiera que almacene la clave, su aplicación debe poder descifrar los datos, al igual que un atacante. Hay dos posibles soluciones a este problema que conozco:
- Coloque la llave en un lugar lo más seguro posible. Eso significa que seguramente debe colocarse fuera del directorio www-root en un directorio inaccesible en el servidor. Dependiendo de la importancia de los datos, también puede considerar externalizar el cifrado a otro servidor dedicado.
- No almacene ninguna clave y derivela de la contraseña del usuario. Esta es la única forma realmente segura, porque ni siquiera el servidor puede descifrar los datos. Las desventajas son, por supuesto, que el usuario necesita ingresar la contraseña cada vez que usa su servicio. Si el usuario cambia la contraseña, debe volver a cifrar todos los datos. Si el usuario olvida la contraseña, los datos se pierden.
PD Recomendaría cifrar los datos antes almacenándolo en la base de datos, porque MySQL AES_ENCRYPT usa el modo ECB sin un IV. Esto permite buscar un valor determinado, pero es menos seguro (estoy bastante seguro de que no desea buscar por contraseña).