转载:Access数据库的安全机制、隐患及改进策略
【摘 要】Access数据库作为桌面数据库系统,因其操作便捷、界面友好等优点而拥有大批用户,但它也存在着不容忽视的安全问题。文章剖析了Access数据库采用的安全机制及存在的问题,提出了增强安全、消除隐患的方法。 【关键词】Access;数据库;安全机制 Acces
【摘 要】Access数据库作为桌面数据库系统,因其操作便捷、界面友好等优点而拥有大批用户,但它也存在着不容忽视的安全问题。文章剖析了Access数据库采用的安全机制及存在的问题,提出了增强安全、消除隐患的方法。【关键词】Access;数据库;安全机制
Access是一款适合中小型企业使用的数据库系统,由于它高效、经济、实用,受到广大使用者的青睐。但是,它的加密系统一直是人们所关心的问题。就以Access97为例,其数据库文件的密码最多能设置14位,存放于这个文件头部第66个字节至第79个字节的固定序列,解密者只需要生成一个空白密码的MDB文件,把上述位置的14个字节的内容即MDB的公用密钥拷贝下来,覆盖到加密的MDB文件这个对应的位置,密码就完全消除了。在Office XP下,Access数据库的安全机制已经更为完善。除了对数据库设置密码保护,对数据库进行压缩,还可以使用用户级的安全机制,在用户级别上控制对数据库的访问。
一、Access XP数据库的安全机制
为了避免应用程序及其数据遭到意外或故意地修改或破坏,Access XP提供了一系列安全保护措施:
第一,可设置数据库访问密码。数据库访问密码是指为打开数据库(.MDB)而设置的密码,它是一种保护Access数据库的简便方法。设置密码后,每次打开数据库时都将显示要求输入密码的对话框,只有键入了正确的密码才能打开数据库。
第二,可对数据库进行加密。数据库访问密码仅提供从Access界面进入数据库的安全保护,但不能防止使用其他手段来打开数据库文件。因此,常利用数据库加密作为对数据库密码等安全机制的补充。数据库加密通过压缩数据库文件来实现,压缩的同时对数据库文件起到安全保护的作用。压缩后的数据库难以用一般程序或字处理器等软件工具对其解密。但对数据库加密并不限制用户访问对象。若数据库未设置访问密码,尽管用数据库加密方法压缩了数据库文件,人们仍可在Access窗口打开该数据库,对数据库中的对象拥有完全的访问权。
第三,可设置VBA工程密码。Access可通过为VBA工程设置密码来保护应用程序的代码。这种密码一旦设置,则打开VISUAL BASIC编辑器窗口后,只有键入了正确的密码,VBA代码才能查看或修改,但并不影响VBA代码的运行。
第四,可将数据库保存为MDE文件。这种方法既能保护VBA代码,又能保护窗体和报表。在生成MDE文件时,Access在编译了所有模块后,随即删除了所有可编辑的源代码,并对数据库进行了压缩,其结果既保证了VB代码能够运行,也使MDE数据库可与MDB数据库一样运行,而且数据库的大小因删除源代码和压缩数据库而得以减小。
第五,可设置用户级安全机制。用户级安全机制通过设置用户密码和权限,限制用户对数据库及其对象的访问,并建立对敏感数据和对象的不同访问级别。用户级安全机制使用扩展名为.MDW的工作组信息文件来保存信息,一个工作组信息文件定义一个工作组,用于存储用户的账号信息,包括账户名、个人ID、密码和所属的组,以及组与用户访问数据库中对象的权限。
对于桌面上的数据库管理应用来说,Access数据库的安全机制已经可以满足使用要求了,但从根本上来说,Access数据库的安全性设计是不完善的。
二、Access数据库存在的安全漏洞和隐患
(一)数据库加密机制简单,易于破解
Access数据库系统通过将用户输入的密码与某一固定密钥进行异或操作来形成一个加密串,并将其存储在MDB文件中一段特定的地址区域内。由于异或操作的特点是“经过两次异或就恢复原值”,因此,用这一密钥与*.mdb文件中的加密串进行第二次异或操作,就可以得到数据库的密码。又如本文开头所述,在Access97中,人们用密码覆盖的方法也可以轻易解除密码,Access2000的加密系统进行了较大的改进,它的密钥是按日期随机生成的,也就是说,不同的时间产生的MDB文件,其密钥是不同的,很难正确获取破解要解密的MDB文件的密钥,对于大多数用户,可以说是较为牢固了,因为在用户访问数据库的同时,加密系统还会分析散布在文件各处的校验码,检验密码是否有被非法改动,如果用密码覆盖的方法破解它,只会破坏该数据库。然而,Access2000还是把加密的密码字串放在以第66字节开始的文件区域内,该密码存储在文件头部的方式仍然是不保险的。Access2000可以让用户设定最多20位的密码,其密码区域不是连续存储的,而是隔位放置密码串,所以,密码区域有40位字节的长度,40位的字节长度内,有用的只有20个字节,再从这20个字节入手分析会发现,其中的10个字节的密钥是固定的,它们不是按日期随机生成的,所以,在一些破解软件里,可以轻易地获取奇数位的密码,最后,只剩下10个字节的密码,对于非法的用户来说,穷举法破解也不是太难,只是时间的问题了。
(二)工作组信息文件带来安全隐患
Access2000有一个默认名为system.mdw的工作组信息文件,该文件存放了Access数据库的全部安全信息,包括用户账号和组账号。需要注意的是,该System.mdw工作组信息文件是不安全的。因为在安装Access的同时,安装程序自动将默认的工作组定义在其创建的工作组信息文件中。在用户还没有使用”工具组管理器”指定其他的工作组信息文件之前,再次启动Access时,都使用默认的工作组信息文件。默认状态下原System. mdw工作组信息文件之所以不安全,是因为它的工作组ID是空白的,任何人都可以获得该工作组信息文件定义的管理员账号,具有访问数据库的各种权限,这对数据库来讲是很不安全的。
(三)管理员用户引发安全漏洞
“管理员”用户是Access系统的缺省用户,也就是说,Access系统将以默认的“管理员”用户登录Access,而微软将其用于标记该“管理员”账户的用户1D号设成了一个固定值,这就意味着全世界的Access系统的“管理员”用户在Access中都是同一个用户,这样,问题就出现了——如果一个未联入你的工作组安全系统的用户在网络文件系统级别上可以获得对你的数据库系统文件的管理权,他将以“管理员”用户的身份拥有对该数据库系统的所有权利!由Access本身建立起来的第二级安全机制将不起任何作用。这种情况很容易发生—工作组用户只要在他的计算机上重新安装一次Access软件,他将会轻而易举地避开你设署的安全系统的防护,以“管理员”用户登陆并操作工作组中任何数据库系统。
三、改进数据库安全机制的对策
针对Access数据库存在的安全漏洞和隐患,应采取如下改进措施:
(一)通过编程改进Access数据库的加密算法
这里介绍一种在VB中设置Access密码的解决方案,在VB中,用关键字ALTER DATABASE设置、修改数据库密码。使用该方法之前,应先设置对Microsoft ADO Ext 2.5 for DDL and Security库的引用。具体语法是:
ALTER DATABASE PASSWORD New Password Old Password
第一次设置数据库密码时,使用NULL关键字作为ALTER DATABASE语句中的Old Password参数,其代码如下:
Dim objConn As ADODB.connection
Dim strSetPassword As String
·创建SQL串以初始化一个数据库密码
StrSetPassword="ALTER DATABASE PASSWORD NewPassword NULL;"
Set objconn. =New ADODB .Connection
’设置数据库的打开方式为独占
objconn.Mode=adModeShareExclusive
·打开数据库,path为数据库的路径
objconn.Open "Provider=Microsoft.Jet.OLEDB.4.0; DataSource=Path;"
’执行SQL语句设置数据库密码
objconn.Execute (strSetPassword)
修改数据库密码时,首先要用旧密码登录数据库,然后再更改密码。其代码如下:
·用旧密码登录
objconn.Mode=adModeShareExclusive
objconn.Provider="Microsoft.Jet.OLEDB.4.0"
objconn.properties("Jet.OLEDB:Database Password")="Oldpassword"
objconn.Open "DalaSource=Path "
’修改密码
StrSetPassword=" ALTER DATABASE PASSWORD NewPassword"
objconn.Execute (strSetPassword)
删除数据库密码操作类似于修改密码过程,只需使用NULL关键字作为ALTER DATABASE语句的NewPassword参数即可。
(二)消除由System.mdw文件带来的隐患
可以使用工作组管理员程序来对工作组信息文件进行管理。数据库管理员有权增加、删除组和用户。最好把开发同一个项目的成员设计成为一个组。Access将用户归类到各种组中,所以数据库安全管理可以得到极大的简化,也就是为组而不是为单个用户指定权限,然后通过将用户添加到组中或从组中删除的方式来更改单个用户的权限。对于处于同组的用户授予新权限,只要执行一个操作,即可对该组账号授予新的权限。为了数据库的安全,对不再使用数据库的用户和组,应做到及时删除。
(三)消除由“管理员”用户引发的安全漏洞
对于解决由“管理员”用户所引发的安全漏洞,笔者的基本思路是屏蔽“管理员”用户对数据库的所有权限,首先,在管理员用户组中增加一个新的与“管理员”用户等同的新用户,例如为mine,然后以这个新用户登录Access,从管理员用户组将“管理员”用户撤出,并屏蔽掉“管理员”用户对数据库的所有权限,这样,“管理员”用户就成为了一个普通用户,实际的数据库系统管理员则变为新用户(mine),而你的数据库安全系统就对所有的用户起安全防护作用了。
四、结语
Access数据库已广泛应用于各行各业,给我们带来极大的方便,它虽然存在一些不足,但是只要我们在实际应用中多考虑Access数据库的安全问题,风险还是可以避免的。本文中分析的对数据安全性的操作在数据库的访问中起着一定的作用,但是,尽管人们想到了种种办法来尽量维护自己的数据库安全,也总是不断有漏洞被发现。所以,为了确保数据库的安全,数据的备份与恢复是必不可少的最后一道防线。