¿Es verdadero el "¿Por qué debería evitar AES en MySQL?"

23

De un artículo de la revista Smashing 2012 Se hace una declaración bastante audaz para evitar AES en MySQL. O como dicen "¿Por qué debes evitar AES en MySQL?". Sin embargo, si busca el cifrado de SQL, a menudo encuentra el AES_ENCRYPT de (Mi) SQL mencionado. No estoy diciendo que muchos resultados de búsqueda signifiquen que la afirmación no es cierta, pero me hizo pensar: ¿son las tres razones citadas a continuación realmente verdaderas?

¿Qué piensan los expertos en seguridad aquí acerca de las razones por las que Mcrypt de PHP es superior a las funciones AES de MySQL ?:

  
  • MySQL necesita un enlace de base de datos entre la aplicación y la base de datos para que se produzca el cifrado y el descifrado. Esto podría ocasionar problemas de escalabilidad innecesarios y errores fatales si la base de datos tiene fallas internas, lo que hace que su aplicación sea inutilizable.
  •   

No puedo entender este problema; Si encripta / desencripta en PHP, también necesita almacenar los valores en la base de datos con un enlace a la base de datos. Si el descifrado falla en el lado de php, esto también conduce a fallas en la aplicación? ¿Cuál es el punto señalado aquí?

  
  • PHP puede hacer el mismo descifrado y cifrado de MySQL con un poco de esfuerzo pero sin una conexión de base de datos, lo que mejora la velocidad y la eficiencia de la aplicación.
  •   

¿Php puede hacerlo "con un poco de esfuerzo" y eso mejora la velocidad de la aplicación? ¿Porque está encriptando antes de que se envíe por cable, la aplicación (que manejará el encriptado) gana mayor velocidad y eficiencia? ¿Cómo podría ser verdad? En mi opinión, se trata de la "mejor herramienta para el trabajo", por lo que el argumento de que "php también es capaz" no significa que sea la herramienta best también. Es solo una herramienta a , sin el argumento de por qué es la mejor herramienta.

  
  • MySQL a menudo registra transacciones, por lo que si el servidor de la base de datos se ha comprometido, el archivo de registro generará la clave de cifrado y el valor original.
  •   

Este es un punto válido si encripta los valores en la base de datos y tiene activado el registro. Al menos debe desactivar el registro de consultas generales como registro binario solo registra transacciones pero no declaraciones selectas. Si no necesita ningún registro en absoluto, simplemente puede hacer la declaración "si usa AES en MySQL, desactive todos los registros". Eso me parece más válido que "si quieres usar AES en MySQL, hazlo en PHP".

¿Puede alguien explicarme por qué los puntos anteriores pueden ser válidos y por qué, en general, es mejor cifrar sus datos en su aplicación (php) en lugar de en (My) SQL?

    
pregunta Jurian Sluiman 21.11.2013 - 11:30
fuente

4 respuestas

17

La razón principal para no usar las funciones AES_ * en MySQL es porque están usando el modo de operación de bloque ECB, que es inseguro.

Lea más en:

enlace

Editar: Desde MySQL 5.6.17 las cosas han cambiado y MySQL es compatible con el modo de bloqueo CBC, pero tiene que habilitarse manualmente. Lea enlace

    
respondido por el Matrix 22.11.2013 - 08:28
fuente
5

En cuanto al rendimiento, sugiero que dejar que MySQL haga el cifrado AES no es gran cosa. Es probable que pierda (en promedio) mucho más tiempo en recuperar / escribir los datos que en cifrarlos. Esto es a menos que toda la base de datos lo haga encriptar y descifrar.

Sin embargo, hay un gran problema al permitir que MySQL haga el AES: necesita que su aplicación PHP emita una consulta en MySQL donde la clave de cifrado se pasa como texto simple. Para proteger eso, tendría que usar una conexión segura, o de lo contrario, un comando tcpdump puede fácilmente escuchar en su discusión de PHP-MySQL.

Si su aplicación PHP cifra los datos internamente, es una exposición menos de sus datos y un componente menos que trata con datos no cifrados o claves visibles.

    
respondido por el Shlomi Noach 15.01.2014 - 20:59
fuente
4

(No estoy de acuerdo en que sea un duplicado de ¿Es preferible realizar el cifrado utilizando funciones de base de datos o código? aunque hay mucha superposición)

La única justificación que se me ocurre para la publicación, y es una importante y válida, es que es fácil escalar el nivel de aplicación (PHP) pero difícil escalar un nivel de base de datos relacional (MySQL). Para el primero, solo se agrega más servidor, pero el último necesita cajas más grandes / agrupación coordinada. Por lo tanto, hacer el cifrado en PHP reduce la carga en el DBMS.

Además, con respecto a "MySQL necesita un enlace de base de datos ...", enviar los datos a otro lugar para procesarlos introduce latencia. Calcular el valor cifrado o descifrado de algunos datos puede ser una tarea difícil, pero es poco probable que se demore tanto como enviar material a través de una red.

Pero la pregunta principal es cómo encaja esto en el modelo de seguridad, y ahí es donde entra la cuestión de los registros y la administración de claves.

    
respondido por el symcbean 21.11.2013 - 17:36
fuente
4

Según la documentación de MySQL sobre las funciones de cifrado, enlace

  

Precaución

     

Las contraseñas u otros valores confidenciales suministrados como argumentos para   las funciones de cifrado se envían en texto sin formato al servidor MySQL a menos que   Se utiliza una conexión SSL. Además, dichos valores aparecerán en cualquier MySQL   registros en los que están escritos. Para evitar estos tipos de exposición,   Las aplicaciones pueden cifrar valores confidenciales en el lado del cliente antes   Enviándolos al servidor. Las mismas consideraciones se aplican a   claves de cifrado. Para evitar exponerlas, las aplicaciones pueden utilizar almacenadas.   procedimientos para cifrar y descifrar valores en el lado del servidor.

Para evitar esto, sugieren el cifrado en el lado del cliente.

    
respondido por el Karthick 01.12.2014 - 17:31
fuente

Lea otras preguntas en las etiquetas