Pregunta

Planeo usar MySQL y su funcionalidad de cifrado integrada para cifrar / descifrar ciertas columnas en ciertas tablas. La preocupación que tengo es que necesito guardar la llave en algún lugar. Ciertamente, podría almacenar la clave en un archivo y controlar los permisos de ese archivo y los permisos de la aplicación que accede a él, pero ¿es eso suficiente? También podría crear un servicio web para obtener la clave o algo así.

Estoy en una pequeña tienda donde sería la única (posiblemente otra persona) que tendría acceso a la máquina en la que se encontraba la aplicación. Editar: debo agregar que hay una parte orientada hacia la web de esta aplicación que necesitaría descifrar los datos a menos que agregue un nivel.

He buscado ad nauseum, pero nadie parece tener una respuesta a prueba de balas.

¿Este es uno de esos problemas en los que tienes que conformarte con lo suficientemente bueno? Dado que estoy usando MySQL y PHP (posiblemente Python), ¿hay una mejor manera de abordar esto?

¿Fue útil?

Solución

No estoy seguro de que usar MySQL para la encriptación sea la mejor solución para su problema.

El paquete M_CRYPT de PHP se considera bastante bueno y le ofrece la flexibilidad de elegir el algoritmo que mejor se adapte a sus necesidades.

Almacenar su clave en otro servidor tiene una gran ventaja: la clave no está en la misma máquina que los datos encriptados *) . Entonces, mientras el atacante no tenga suficiente control sobre la máquina comprometida, no podrá acceder a la clave. Si el atacante obtiene el control total de la máquina en la que se almacenan los datos, es muy probable que puedan consultar la clave del servicio web.

Sin embargo, transmitir la clave de una máquina a otra abre un área completamente nueva que necesita ser asegurada. Probablemente involucre más claves y más capas de encriptación, lo que aumenta la posibilidad de cometer errores.

*) La otra opción es ingresar la contraseña al iniciar el servidor web y mantenerla en la memoria.

Posible solución
Si ve una solución empleada que utiliza el siguiente método para cifrar archivos para usuarios con acceso a la web (no estoy seguro de su entorno, pero podría ser útil):

  • Al crear el usuario, se asigna una clave aleatoria larga al nuevo usuario.
  • Esta clave aleatoria se almacena en una columna cifrada en el registro del usuario.
    ( ¡solo esta columna está cifrada para no afectar el rendimiento del resto del registro! )
  • El cifrado de la columna de clave aleatoria se realiza con 1 contraseña maestra, almacenada en un archivo o en la memoria.
    ( La mejor opción es ingresar la contraseña al iniciar su servidor web y almacenarla solo en la memoria. )
    ( Otro enfoque sería permitir al usuario ingresar una contraseña y usarla para cifrar / descifrar la columna de clave aleatoria, pero no estoy seguro de si eso aumentaría o disminuiría la seguridad )
  • Todos los documentos que se deben cifrar se cifran con la clave aleatoria para ese usuario y luego se almacenan en el disco.
  • Los documentos se almacenan con permisos mínimos en el sistema de archivos.

Las ventajas de este enfoque son:
1. La clave aleatoria está encriptada en la base de datos. Así que todavía tiene la seguridad adicional del servidor de base de datos, en combinación con la columna cifrada. 2. Los documentos se almacenan con claves diferentes, si el atacante obtiene una clave, solo se compromete una parte de los documentos.

Sin embargo:
Si el atacante se apodera de la contraseña maestra y tiene acceso de lectura a la tabla de usuarios, todo el sistema está, una vez más, roto.

Otros consejos

Probablemente lo almacenaría en un archivo que se encuentra en un directorio que no es accesible a través de la web y está bloqueado con los permisos del sistema de archivos tanto como sea posible.

Su secuencia de comandos web no debe abrir ningún archivo del sistema de archivos con variables, especialmente las proporcionadas por el usuario. Ni siquiera les dé la opción de pasar algo por el filtro de entrada (está filtrando los datos proporcionados por el usuario, ¿no?) Y posiblemente renunciar a los contenidos del archivo clave. Mantenga las rutas de los archivos a cadenas codificadas y defina únicamente las de (). Dado que la mayoría de sus datos se almacenan en MySQL, esto no debería ser un problema.

Al hacer el descifrado, lea la clave en una variable limpiamente inicializada, haga el descifrado, luego sobrescriba la variable clave (digamos con una cadena de x) y desactive la variable. Es probable que todo esto parezca un poco paranoico, pero si minimiza el tiempo en que queda la clave en la memoria y lo aísla de todas las demás variables que vuelan alrededor de su script PHP, no puede hacer que sea menos seguro.

Si usted y la otra persona son los únicos que tienen acceso físico a la máquina, esto probablemente esté bien. Si alguien ingresa y roba la caja, bueno, tienen todos tus datos de todos modos, así que se acabó el juego.

Parece que está considerando el uso de una clave 'específica de columna' para usar con 'AES_ENCRYPT' y 'AES_DECRYPT'. Como dijo el comentarista, esta es una mala idea, ya que cualquier intrusión tendrá acceso a todos los datos.

Si usas una contraseña 'proporcionada por el usuario', con / sin un salt, estás siendo mucho más seguro.

Dicho esto, si la clave de cifrado solo es legible por la aplicación que la usa, es probable que sea 'lo suficientemente bueno'. Si la máquina se divide, obtendrán sus datos más rápido con una sola clave.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top