Admito completamente el cifrado de información confidencial mientras está almacenado. El cifrado de información confidencial en la base de datos impide que un atacante recopile información útil si ha obtenido la base de datos. Sin embargo, como siempre, la forma en que implementa el sistema de cifrado es de importancia crítica.
Primero debemos comparar y contrastar dos situaciones en las que la base de datos está comprometida:
- La situación uno ocurre cuando la base de datos se ha comprometido, pero el sistema de archivos sigue siendo seguro.
- La situación dos ocurre cuando tanto la base de datos como el sistema de archivos están comprometidos.
La situación uno es cuando el cifrado es el más útil. Este tipo de ataque ocurre cuando el atacante ha utilizado un método como la inyección SQL. Esto es ideal porque el atacante no tiene una clave / método de descifrado y tendría que aplicar una fuerza bruta a la clave de descifrado para obtener los datos (esto no debería ser factible).
La situación dos es mucho menos favorable. Este tipo de ataque ocurre cuando el atacante ha obtenido acceso al servidor (por ejemplo, acceso físico, FTP, SSH, etc.). Debido a que el atacante ha obtenido acceso al sistema de archivos, es probable que tenga la clave de descifrado, lo que significa que solo puede descifrar la base de datos y se acabó el juego.
Sin embargo, tiene una ventaja aquí porque tiene un servidor frontend y un servidor backend. Esto significa que puede implementar un diseño más seguro para protegerse contra la situación dos. Puede cifrar / descifrar en ambos servidores, lo que significa que el atacante tendría que comprometer ambos sistemas de archivos del servidor. Esto es lo que quiero decir: el servidor frontend puede cifrar los datos confidenciales con su propia clave; enviar esos datos al servidor de back-end; el servidor backend luego encripta los datos encriptados usando una clave diferente; y, finalmente, el servidor de back-end almacena los datos encriptados doble. El proceso de descifrado es justo lo contrario de esto: el servidor backend extrae los datos con doble cifrado; el servidor backend descifra la primera capa de cifrado y la envía al servidor frontend; el servidor front-end elimina la segunda capa de cifrado; finalmente, el servidor frontend muestra los datos confidenciales descifrados al usuario.
Todo lo dicho, como dice la respuesta de Kevinze, hay otras protecciones que deberían estar en su lugar. Debe utilizar HTTPS (SSL / TLS) para las comunicaciones entre el usuario y el servidor frontend. Esto evitaría MiTM (en la mayoría de los casos) y ayudaría a proteger las comunicaciones entre el cliente y el servidor. También debe considerar otras protecciones como el cifrado completo del disco. No puedo darle mucha información sobre esto, pero, por supuesto, agregaría protección al sistema de archivos.
En su pregunta, usted preguntó sobre la actualización de su base de datos y su conversión a una forma cifrada. Si estuviera en su posición, construiría una nueva base de datos para almacenar la información encriptada y luego escribiría un programa para leer todas las entradas de la base de datos anterior, iterar sobre ellas, cifrar las columnas confidenciales e insertarlas en la nueva base de datos. Aquí hay un pseudo-código:
All_Entries[][] = Fetch_Array_All_Entries(FROM_OLD_DATABASE); // Multidimensional Array
for(int i = 0; i < count(All_Entries); i++){
thisEntry = All_Entries[i];
encryptedEntry = new Array();
encryptedEntry["Some Insensitive Column Name"] = thisEntry["Some Insensitive Column Name"];
encryptedEntry["Sensitive Column 1"] = encryptColumn(Backend_Key, encryptColumn(Frontend_Key, thisEntry["Sensitive Column 1"]));
encryptedEntry["Sensitive Column 2"] = encryptColumn(Backend_Key, encryptColumn(Frontend_Key, thisEntry["Sensitive Column 2"]));
// ... Encrypt all sensitive columns and assign them to the encryptedEntry ...
// Once all encryption is done:
Insert_Array_Entry(TO_NEW_DATABASE, encryptedEntry);
} // end entry loop
Una vez que la nueva base de datos se haya actualizado con entradas cifradas, simplemente reemplace la antigua base de datos con la nueva.
Tu pregunta menciona el cambio de VARCHAR
a VARBINARY
. Esta es realmente su propia elección, pero podría continuar usando VARCHAR
si convierte los bytes a un formato de cadena. Por lo general, los datos encriptados se muestran como una cadena Base64. Una vez más, tienes que tomar esa decisión por ti mismo, pero así es como probablemente lo haría.