Encriptar base de datos Access – AES vs RC4
En el primer artículo de la serie de Medidas básicas de seguridad para aplicaciones Access, en el que dividimos el proyecto en BE (datos) y FE (aplicación), expliqué por encima el método de cifrado que utiliza Access a partir de su versión 2007, pero creo que el tema es lo suficientemente complejo como para dedicarle un artículo completo. Además, la información que hay escrita al respecto es muy escasa, en muchos casos incorrecta y hay muy poco en nuestro idioma.
A priori parece que la importancia de todo esto es limitada (dependiendo del nivel de seguridad que necesitemos), pero toda mi investigación empieza cuando recibo el siguiente mensaje informativo al encriptar el BE:
El cifrado de bloques no es compatible con el bloqueo por filas, por lo que este se omitirá.
La frase es bastante complicada de entender, más que nada por un problema de traducción. ¿Qué se omite? ¿El cifrado o el bloqueo por filas? Si buscamos un poco, encontraremos el mensaje en inglés, en el que se ve claramente que se refiere al bloqueo por filas.
Encrypting with a block cipher is incompatible with row level locking. Row level locking will be ignored.
Para continuar, tenemos que tener claro lo que es el cifrado por bloques y el bloqueo por registros o filas. Os dejo los links a las entradas de la Wikipedia y de la web Microsoft para quien no lo tenga claro y seguimos con nuestra investigación.
Como decía en el artículo sobre dividir la base de datos, a partir de su versión 2007, Access encripta y protege con contraseña en un solo paso (utilizando la contraseña como clave secreta de cifrado). El método de cifrado es algo en lo que la gente no termina de ponerse de acuerdo, pero después de mucho investigar, creo que lo tengo claro.
El artículo clave para mi investigación es Changing the encryption type in Access 2007 en el que Wayne Phillips explica que Access 2007 utiliza RC4 de 40 bits para encriptar y posteriormente, en los comentarios, actualiza diciendo que Access 2010 utiliza AES de 128 bits. Un usuario le pregunta por la modalidad de «Usar cifrado heredado» de Access 2010 y ahí es donde creo que mete la pata ya que contesta diciendo que en los 2 casos se utiliza el mismo cifrado, afirmación que creo que no es correcta.
Para demostrarlo, he abierto con un editor hexadecimal 3 archivos distintos, uno sin encriptar, otro encriptado con la opción de compatibilidad y otro encriptado con la opción por defecto:
Archivo sin encriptar
Podemos ver que la cabecera del archivo no hace ninguna mención a algoritmos de encriptación. Además, se pueden leer los datos en texto plano.
Archivo encriptado con la opción de compatibilidad
Podemos ver el proveedor criptográfico pero no nos da información sobre el algoritmo. He investigado un poco más, y con un programa que recomienda el propio Wayne Phillips he podido comprobar que está encriptado con RC4 de 40 bits. No nos muestra ningún mensaje informativo al encriptar
Archivo encriptado con la opción por defecto de Access 2010
En este caso, al abrirlo con el editor hexadecimal, ya si nos muestra en XML la información sobre el algoritmo de encriptación. En este caso AES de 128 bits y SHA-1 para el hash. Pero en este caso es en el que nos aparece el famoso mensaje informativo, El cifrado de bloques no es compatible con el bloqueo por filas, por lo que este se omitirá.
La aplicación que estoy desarrollando va a funcionar en un entorno multiusuario por lo que en principio el mensaje me puso en alerta, si se omite el bloqueo por registros, creo que voy a tener que conformarme con el cifrado RC4 de 128 bits… Es más, en varios sitios especializados tanto en bases de datos como en Access leí que no se podía utilizar algoritmos de encriptación por bloque en bases de datos con bloqueos de registro. O se utilizaba uno o el otro. Ejemplo1, Ejemplo 2 (aquí no tienen muy claro qué es lo que hace), Ejemplo 3 (de los mejores foros del mundo y tampoco lo tienen claro, un usuario llega a decir que no es posible).
Así que seguí con mi investigación, recorriendo cientos de webs sin sacar nada en claro. Al final, la respuesta estaba en el sitio menos esperado, en el sitio en el que se suponía que tenía que estar, la web de Microsoft, escondido, pero allí estaba:
Note When you encrypt a database with a password, the encrypted database will use page-level locking, regardless of your application settings. This may affect the availability of data in a shared environment.
Es decir, que no se eliminaba el bloqueo, se cambiaba el bloqueo por registros a bloqueo por páginas y aunque en la nota que publica Microsoft en su web, parece indicar que esto puede afectar negativamente en entornos multiusuario, no estoy de todo de acuerdo.
Es verdad que en el bloqueo por página, en vez de bloquear solo el registro, se bloquea el área de memoria que contiene el registro, pudiendo ello llevar a bloquear otros registros. Pero está demostrado que generalmente el rendimiento es superior en el bloqueo por páginas que en el bloqueo por registros.
Conclusión: Creo que la mejor opción para encriptar una base de datos con Access 2010 es la que trae por defecto, tanto para aplicaciones multiusuario como para aplicaciones sencillas monousuario. Utiliza el algoritmo AES de 128 bits con SHA-1 para el hash y en vez de bloqueo de registros, bloqueo de página (superior a mi entender que el bloqueo por registro).
Si por alguna razón es necesario el bloqueo por registros, no se puede utilizar un algoritmo de encriptación por bloques así que la única solución es utilizar RC4 (que investigando un poco podréis ver que se puede mejorar hasta 128 bits).
Resúmen:
Access 2007:
- Única opción algoritmo RC4, por defecto de 40 bits (mejorable a 128 bits)
Access 2010:
- Encriptación con compatibilidad: RC4, por defecto de 40 bits (mejorable a 128 bits). Posibilidad de bloqueo por registros.
- Encriptación por defecto: AES de 128 bits (mejorable a 256 bits). No se puede utilizar bloqueo por registros pero si bloqueo por páginas.
Arkaitz Arteaga
Latest posts by Arkaitz Arteaga (see all)
- Access: Encriptar contraseñas con SHA-256 utilizando biblioteca de clases .NET con C# - 4 mayo, 2014
- Rendimiento de Access contra backend Access en servidor de archivos remoto. Cuarta parte. - 27 abril, 2014
- Rendimiento de Access contra backend Access en servidor de archivos remoto. Aclaración. - 21 abril, 2014
- Utilizar biblioteca de clases .NET en Access. Tercera aproximación a la Interoperabilidad COM - 14 abril, 2014
- Vincular tablas en Access con Visual Basic - 11 abril, 2014
- AES | Aplicaciones | BackEnd | Encriptación | Programación | Seguridad | Visual Basic