Estoy auto entrenado en el uso de cifrado. Soy un desarrollador de php y en mi tiempo libre estoy creando una aplicación en línea que proporciona funciones básicas de cms para ayudarme a entender más el diseño de cifrado. Estoy usando el cifrado para proteger los datos en caso de robo y tenerlos a disposición del público como lo que le sucedió a adobe.
Mis restricciones para esta aplicación son:
-
Los usuarios finales usarán esta aplicación y no se puede confiar en que recuerden su contraseña todo el tiempo, por lo que su contraseña no se puede usar en el proceso de encriptación ya que habrá una alta probabilidad de que necesiten restablecer su contraseña en alguna etapa.
-
No se puede permitir el software de administración de clave de proveedor o hsm.
-
No se pueden cargar usuarios en una clave al iniciar sesión en cms para cifrar o descifrar datos durante la sesión. De hecho, los usuarios no tendrán acceso a las claves utilizadas, ya que no se puede confiar en ellas para mantenerlas seguras. Además, los usuarios externos como contratistas tendrán acceso a cms. Así que todas las claves se gestionan por aplicación debajo de las cubiertas.
Los datos serán almacenados en un db encriptado. El código cifrará los datos ya que no estoy usando el cifrado nativo de mysql.
Los datos se cifrarán utilizando una clave simétrica.
La clave simétrica se almacenará en otro servidor con cortafuegos y solo se podrá llamar a través de cms ip. El CMS cuando necesita una clave simétrica particular llamará al servidor que almacena las claves simétricas y pasará un valor de hash que se utilizará para buscar la clave simétrica correcta. Cuando se localice la clave, la enviará de vuelta a la cms y la cms almacenará la clave en memcached.
Ahora pensaba que tenía que proteger las claves simétricas, así que lo que pensé que debía hacer era cifrar las claves simétricas con una clave pública asimétrica y almacenar la clave simétrica cifrada en una base de datos en el servidor que no es cms. la clave que utiliza la clave privada almacenada en el servidor cms para descifrarla.
Yesh!
Es como pollo / huevo!
Me preguntaba si alguien me puede dar alguna orientación sobre cómo hacer esto correctamente. Mi objetivo para este proyecto es proteger los datos si la db es robada.
Creo que es malo almacenar la clave privada en el servidor cms porque si el servidor no cms que almacena las claves simétricas utilizadas para cifrar los datos también se piratea, todas las claves están disponibles.
La aplicación también verificará las entradas para los intentos de inyección, Xss, utilizando la lista blanca de ip para acceder a cms, cifrando la cookie de sesión, limpiando los datos de entrada y otros elementos básicos de seguridad básicos.