Me preguntaba cuál es la mejor manera de proteger los datos en reposo (cifrar / descifrar) en una aplicación php (eq: almacenada en una base de datos) utilizando AES.
¿Dónde está la mejor manera de almacenar las claves?
Todo depende del tipo de información que desee proteger y del tipo de base de datos que esté ejecutando.
Si está solicitando esto a una compañía que maneja tarjetas de crédito, registros de salud o información confidencial similar, me gustaría recomendar que no haga su propia implementación. Muchas cosas pueden salir mal y sería muy difícil llegar al nivel de cumplimiento. También algunos otros factores prácticos juegan un papel (rendimiento, gestión de claves, auditoría, etc.). Es difícil hacerlo bien por tu cuenta. Hay algunos productos comerciales asequibles que abordan esta misma situación. Algunos proporcionan cifrado a nivel de columna para las bases de datos de código abierto y la compañía se dirige a las PYME, lo que significa un precio relativamente asequible.
Como indicas en tu pregunta, el problema se trata de administrar los secretos (claves y tokens de acceso).
El uso de soluciones de encriptación complejas y / o remotas tendrá un gran impacto en su rendimiento y escalabilidad. Desea que sus claves estén inmediatamente disponibles para su código, pero limite la exposición en otros lugares (otros procesos, copias de seguridad). La memoria compartida, el caché de APC (pero no el caché de memoria más reciente) son candidatos obvios. El uso de PHP-FPM (que se ejecuta como un uid diferente) en lugar de mod_php proporciona un mejor aislamiento si no tiene un caché web separado frente a su servidor web.
La forma en que cifre sus datos depende en gran medida de la estructura de los datos y de cómo se accederá a ellos. Vea otras preguntas aquí sobre la administración de contraseñas de bases de datos y el cifrado de datos dentro de la base de datos.
Depende de la estructura de red y la topología de su sistema, en algunos casos, como el sistema distribuido, puede utilizar un esquema de intercambio secreto, como shamir, rabin IDA o Krawcyk. También puedes usar PKI para eso.
Por lo general, en la práctica solo se almacena el hash de las contraseñas. Pero para la clave, el esquema de intercambio secreto shamir es poderoso para almacenar la clave de manera segura. Que solo un número aceptable de participantes puede recuperar la clave como umbral. También en algunos casos, shamir o rabin IDA se usa entre algunas bases de datos en un servidor y cada una se ha protegido por separado, sin embargo, no se recomienda.
El método krawcyk (el intercambio de secretos se hizo corto) proporciona un híbrido de shamir para la protección de claves y la IDA rabin para la protección de datos y utiliza AES para el cifrado.
Lea más sobre el esquema de intercambio secreto aquí .
También puede usar HSM para almacenar claves de manera segura.