tipo para encriptar encriptada desencriptar contraseña con campo php mysql security encryption key

para - login con contraseña encriptada php



¿Cuál es el mejor método para usar/almacenar claves de cifrado en MySQL? (3)

Planeo usar MySQL y su función de encriptación incorporada para cifrar / descifrar ciertas columnas en ciertas tablas. La preocupación que tengo es que necesito guardar la llave en alguna parte. Podría ciertamente 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 el único (posiblemente otra persona) que tendría acceso a la máquina en la que estaba la aplicación. Editar: Debo añadir que hay una parte de la aplicación web que necesitaría descifrar los datos a menos que agregue un nivel.

Miré ad nauseum, pero nadie parece tener una respuesta a prueba de balas.

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


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

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

Dicho esto, si la clave de encriptación solo es legible por la aplicación que lo usa, probablemente seas "lo suficientemente bueno". Si la máquina se rompe, sin embargo, obtendrán datos más rápido con una sola tecla.


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

La secuencia de comandos de su sitio web no debe abrir ningún archivo del sistema de archivos con variables, especialmente las proporcionadas por el usuario. Ni siquiera les da la opción de deslizar algo pasado su filtro de entrada (está filtrando los datos proporcionados por el usuario ¿no?) Y posiblemente ceder el contenido del archivo de claves. Mantenga las rutas de archivos en cadenas codificadas y define () solamente. 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, realice el descifrado, luego sobrescriba la variable clave (por ejemplo, con una cadena de x) y desarme la variable. Probablemente todo esto suene un poco paranoico, pero si minimiza el tiempo de la clave en la memoria y lo aísla de todas las otras variables que vuelan alrededor de su script PHP, no puede hacerlo menos seguro.

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


No estoy seguro de si usar la compilación de cifrado de MySQL sería la mejor solución a su problema.

Se cree que el paquete M_CRYPT de PHP es bastante bueno y le brinda 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 *) . Así que 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, lo más probable es que pueda consultar el servicio web para obtener la clave.

Sin embargo, la transmisión de la clave de una máquina a otra abre una nueva área que debe asegurarse. Probablemente involucre más capas clave y más capas de cifrado, lo que aumenta la posibilidad de que se cometan errores.

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

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

  • Tras la creación del usuario, se asigna una nueva clave aleatoria larga al nuevo usuario.
  • Esta clave aleatoria se almacena en una columna cifrada en el registro del usuario.
    Solo esta columna está encriptada 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 mirar su servidor web y solo almacenarlo 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 )
  • Cada documento que necesita ser encriptado se cifra con la clave aleatoria para ese usuario y luego se almacena 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. Entonces todavía tiene la seguridad adicional del servidor de base de datos, en combinación con la columna encriptada. 2. Los documentos se almacenan con claves diferentes, si el atacante se apodera de una clave, solo parte de los documentos se ve comprometida.

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, una vez más, se rompe.