Encriptar base de datos Access con VBA – Proteger con contraseña
Una de las tareas más tediosas del administrador de bases de datos Access es la tarea de encriptar/desencriptar una base de datos ya que tienes que acceder en modo exclusivo para poder realizarla. Aunque parezca algo sencillo, el tener que salir de la base de datos sin salir de Access, seleccionar de nuevo desde el menu «Abrir» y abrirla en modo exclusivo, a mi personalmente es de las cosas que más rabia me da cuando estoy desarrollando (hay desarrollos en los que necesitas cambiar varias veces la contraseña, que todavía es peor). Además, como veremos en posteriores artículos, hay veces que necesitas cambiar la contraseña en tiempo de ejecución, por lo que esta funcionalidad nos resultará muy útil.
Antes de empezar con el artículo os recomiendo que os leáis el dedicado a Encriptar bases de datos Access en el que explico los tipos de encriptación para cada versión de Access ya que esta función sirve para todas (a partir de 2007 protege con contraseña y encripta). En principio utilizará el algoritmo que tengamos seleccionado para nuestra versión de Access, pero en el artículo que ops comentaba antes, tenéis varias opciones por si queréis modificarlo.
Pues vamos al lio, lo primero que tendremos que hacer es abrir la base de datos en modo exclusivo, por lo que tendremos que pasarle la ruta y la contraseña actual (si no tiene contraseña, se le pasa una cadena vacía). Para ir adelantando, declaro la función como quedará finalmente, pasando también la contraseña nueva:
Function CambiaPass(ByVal BackEnd As String, ByVal pass As String, ByVal nuevaPass As String)
Declaramos las variables:
Dim trabajo As DAO.Workspace Dim Back As DAO.Database
Y abrimos en modo exclusivo (pasando el parámetro option=TRUE):
Set trabajo = DBEngine.Workspaces(0) Set Back = trabajo.OpenDatabase(BackEnd, True, False, "MS Access;PWD=" & pass & "") 'Abrimos base de datos remota en modo exclusivo
Como ya habréis supuesto, esta acción no se podrá realizar si hay alguien conectado a nuestra base de datos (incluso nosotros) por lo que tendremos que encargarnos de desconectar a los usuarios. Por ejemplo podéis utilizar El administrador de aplicaciones Access para ello (que por cierto, en la próxima versión traerá esta función de encriptar/desencriptar bases de datos con contraseña). Otra opción es mirarse el artículo sobre Desconexión pasiva de usuarios en bases de datos Access.
Una vez tengamos la base de datos abierta en modo exclusivo, solo nos falta modificar la contraseña con esta sencilla instrucción:
Back.NewPassword pass, nuevaPass 'cambiamos el password
Es recomendable comprobar con un par de campos de texto que la contraseña que introduzcas sea la que realmente quieres (el típico repite la contraseña) ya que una vez cambiada, no se puede volver atrás.
Cerramos y listo:
Back.Close Set Back = Nothing
Aunque parezca que en principio solo estamos cambiando la contraseña, lo que hace Access a partir de su versión 2007 es encriptar la base de datos utilizando como clave esa misma contraseña (en Access 2007 utilizará RC4, por defecto de 40 bits mejorable a 128 bits y en 2010 AES de 128 bits mejorable a 256 bits).
Antes de adjuntaros la función completa, me gustaría hacer un comentario para los que seguís mis artículos sobre administrar usuarios en Access
. Si tenéis implementada la desconexión pasiva de usuarios, tenéis que cerrar la conexión persistente antes de poder abrir la base de datos en modo exclusivo. Si teneís problemas a la hora de hacerlo (y de volver a abrirla después), podéis comentar en este artículo o en el de desconexión pasiva de usuarios).
Módulo Encriptar
'************************************************************************************************************************************* 'Autor: Arkaitz Arteaga 'Más artículos: www.programadordepalo.com 'Mail de contacto: admin@programadordepalo.com 'Fecha: Enero 2014 'Version: 1.0 '************************************************************************************************************************************* 'Módulo que enrcripta/desencripta una base de datos Access con contraseña '************************************************************************************************************************************* '************************************************************************************************************************************* 'Copyright: Por favor, no cuesta nada mantener un enlace a mi web en el código. 'Incluso pudes dejar los formularios tal cual, con un enlace a mi web. 'Si vas a utilizar este código con fines lucrativos (es decir, te van a pagar por ello) contacta conmigo por favor. '************************************************************************************************************************************* Option Compare Database Option Explicit Function CambiaPass(ByVal BackEnd As String, ByVal pass As String, ByVal nuevaPass As String) Dim trabajo As DAO.Workspace Dim Back As DAO.Database On Error GoTo mal Set trabajo = DBEngine.Workspaces(0) Set Back = trabajo.OpenDatabase(BackEnd, True, False, "MS Access;PWD=" & pass & "") 'Abrimos base de datos remota en modo exclusivo Back.NewPassword pass, nuevaPass 'cambiamos el password Back.Close Set Back = Nothing Exit Function mal: MsgBox ("Error al cambiar el password. " & Err.Description), vbCritical, "Error al cambiar el password." End Function
Espero que os sirva, y si de momento no le véis utilidad, pronto escribiré un artículo en el que la utilizaremos.
photo credit: Pink Sherbet Photography via photopin cc
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