福建师范大学经济研究所 倪秉书
---- 在编写VB应用程序时,经常要用到它强大的数据库功能,VB数据库与ACCESS都为同一关系模型数据库,两者完全兼容,默认库文件名为.MDB。一些用VB编写的数据库应用软件要求具有很高的数据保密性,我们一般在启动软件时要求输入相应的用户名及口令来确保数据的安全,但是软件所附带的大量.MDB数据库文件,非法人员却可以通过一些软件比如ACCESS方便地打开并查阅其中的敏感数据,有可能造成严重的泻密,如果是存放软件的用户名、权限、密码等信息,则更是如此。一般的做法是,先把数据库文件通过某种算法加密,然后在运行程序时解开,在程序退出时再把文件加密,这种作法不仅费时费力,而且一旦处理不当还有可以造成文件损坏,数据永久性丢失。而ACCESS中提供了一种数据库安全机制,就是在打开数据库前可以要求使用者输入密码,微软提供的这种安全机制可以满足大部份用户的数据安全要求,是比较有效的,而在VB中的Opendatabase方法可以利用编程者在程序中预设的密码打开被设密的库文件,这样用VB编写的程序经过编译之后,密码就被隐含在程序中,软件在要使用到库文件时,利用隐含在程序中的密码打开库文件,存取数据,而无关人员则无法打开软件随带的被预设了密码的数据库文件,使库文件中的数据得到了良好保护。以下就以ACCESS97和VB5为例说明处理的过程:
---- 首先,在ACCESS中以“独占”方式打开一个数据库文件(在打开窗口中选择“独占”框),然后选择“工具”菜单的“安全”项中的“设置数据库密码”,输入密码,确定,存盘退出。接着在VB程序中通过OpenDatabase方法来操作被加密的库文件,因为该方法涉及到数据访问对象(DAO),因此在使用前必须先引用,然后才能使用,方法是:在VB5中打开“工程”菜单,选“引用”项,在打开的“引用窗口”中选择“Microsoft DAO 3.5 Object Library”,确定,退出。为了方便,本例仅举一个简单的例子,在具体的应用中可结合需要对被打开的库文件进行各种其他的操作:新建一个工程,在窗体上放置一个命令控件,运行该程序后,按下命令按钮,则自动打开一个已设密码的数据库文件,为了说明文件确实已正确的被打开,本例在“立即”窗口中把所打开的文件中的所有表的名称都显示出来(当然,数据库本身专用的一些以MSYS等开头的系统表的表名因为未经处理也被显示),在编程之前,先介绍一下Opendatabase方法的语法:
Set dbdatabase=workspace.OpenDatabase
(dbname,options,read-only,connect)
---- 各部分说明如下:
---- dbdatabase:一个对象型变量,用来表示你所要打开的数据库对象;
---- workspace:可选项,一个表示已存在的workspace型对象的对象型变量,如果不指明该变量,OpenDatabase将使用默认的workspace;
---- dbname:一个存在的VB可访问的数据库文件名,当然,也可以是一个开放数据库连接(ODBC)的数据源名(DSN);
---- options:可选项,一般是一个用来设置数据库的各种选项的一个变体型变量,如果设True表明以独占方式打开,False(默认)表明以共享方式打开;
---- read-only:可选项,一个布尔值,True表明数据库以只读方式打开,False(默认),表明以读/写方式打开。
---- Connect:可选项(但在本例中是重点),一个字符串变体,用来指定各种数据库连接信息,如数据库文件类型和密码信息。
---- 现在可以在命令控件的Click事件中加入横线后的代码了:
Option Explicit
Dim dbworkspace As Workspace
Dim dbdatabase As Database
Dim dbtable As TableDef
注释:以上为各对象变量的定义说明部分
---------------------------------
Private Sub Command1_Click()
On Error GoTo vberror
Set dbworkspace = DBEngine.Workspaces(0)
Set dbdatabase = dbworkspace.OpenDatabase
("c:\phone.mdb", True, True, ";pwd=lnlnlln")
---- 注:打开c:\下的一个名为phone.mdb的已设密码的数据库文件,最后一个用引号引起来的参数包括数据库类型和数据库密码,两者之间必须用分号分隔,本处因为使用的是.MDB标准库,所以可不必写类型,但“;“不可省,等号后为密码(本处作者把Phone.mdb的密码设为lnlnlln,注意密码要严格区分大小写)
For Each dbtable In dbdatabase.TableDefs
Debug.Print dbtable.Name
注释:在‘立即’窗口中显示表名
Next
vberror:
MsgBox Err.Description
End Sub
---- 现在,数据库已被加上了一把"锁",除了拥有密码的使用者或应用程序以外,没人会打得开你的数据库文件了,但细心的人也许会发现,现在虽然没有密码就不能用数据库管理系统来打开数据文件,但如果有人用记事本或写字板等一类字编辑软件强行打开一个被加锁的数据库,虽然他不能看到完整的数据,但还可以隐约地窥视到一些断断续续的信息,这时我们可以再次地利用ACCESS的另一种防止用其他软件查阅数据库的加密功能:在ACCESS中打开PHONE.MDB数据库,在"工具"菜单中找到"安全"选项中的"加密/解密数据库".至此,你就可以不用为你的数据安全而整日操心了.
……