Encriptar base de datos Access con VBA – Proteger con contraseña

Encriptar

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
The following two tabs change content below.
Llevo más de 10 años programando, sobre todo en Visual Basic y con bases de datos Access. Para mí, VBA y Access siguen siendo herramientas muy potentes. He desarrollado varios proyectos con PHP y MySql. Si sumo las webs que he tenido, probablemente pasaría de 100. Ahora prefiero dedicar todo mi esfuerzo a este blog (aunque sigo manteniendo unas cuantas...). Trabajo en la administración pública (si, soy funcionario), pero he trabajado en pequeñas empresas e incluso en una "grande" de las telecomunicaciones. Ultimamente estoy bastante metido en abrirme nuevos horizontes con C# y .NET. Renovarse o morir!

Deja una respuesta