2011-01-14 17 views
6

Estamos almacenando datos confidenciales en MySQL, y quiero usar AES_ENCRYPT (datos, 'my-secret-key-here') y luego AES_DECRYPT que funciona muy bien. Mi mayor pregunta es ¿cómo puedo asegurar la clave? Anteriormente yo sólo eras almacenar la clave en un archivo web PHP, así que algo como:Cómo almacenar datos de manera segura en MySQL usando AES_ENCRYPT

define("ENCRYPTION_KEY", 'my-secret-key-here'); 

Esto realmente no funciona, sin embargo, como nuestro servidor MySQL y el servidor web son la misma máquina física, por lo que si alguien obtiene acceso para el servidor, pueden obtener tanto los datos cifrados almacenados en MySQL como la clave.

¿Alguna idea? Estoy pensando que necesito mover la llave a un servidor separado y leerla de forma remota. O bien, ¿qué hay de generar la clave de cifrado de forma dinámica para cada dato? Por ejemplo, tomar el customer_id y ejecutar md5 en él, y luego usarlo como la clave.

Respuesta

0

Coloque la clave secreta en un archivo, cambie el propietario del archivo al mismo usuario que el servidor web. Elimine todos los permisos del archivo para el grupo y para todos los demás.

Hay una pregunta similar en Superusuario (https://superuser.com/questions/139393/linux-file-permissions-access-control-query) - Estoy seguro de que podría obtener una mejor ayuda allí, o simplemente buscando en Google para obtener más información sobre los permisos de archivos en el sistema que está ejecutando.

+0

¿Podría decirnos cuáles serían los permisos de archivos específicos? – mozgras

0

un par de opciones:

  1. guardar la clave de descifrado a un archivo con permisos adecuados
  2. Si realmente desea almacenar la clave fuera del sitio, "montar" una unidad de un equipo diferente. Aun así, necesitaría configurar los permisos correctamente.

La línea inferior es la contraseña maestra que debe ser accesible para el servidor, lo que significa que no hay forma de desactivarla por completo. Lo mejor que puede hacer es establecer permisos de usuario/grupo y asegurarse de que esté fuera de la raíz web.

Si no necesita la capacidad de decodificar el valor a texto sin formato (es decir, si solo está comparando valores como una contraseña) considere usar un hash en su lugar.

Cuestiones relacionadas