在Access Table中存储密码的安全性
论 access Table 中存储密码的安全性
很多朋友在用 Access 编程一段时间后会发现随着本身的编程不断进步,已经能够熟练的使用 access 中的 Table Form Module 来处理数据了,但是进一步的却碰到了很多数据库外围的问题,比如说数据库引用的 DLL 文件、OCX 文件的声明、数据库调用外部文件时要如何用路径、为了避免别人破坏数据库而设定密码的等等问题。今天我就来贡献一点我自己的经验,是有关用户密码及权限的问题。
首先,我们要顺带提一下的是 Access 本身的密码限制以及工作组等方式。(这里以 Access XP 环境作例子)Access 本身的密码限制就是指你在菜单 "工具->安全->设置数据库密码" 中所作的操作,这个密码可以限定打开你数据库的用户,但是一旦你的用户通过你给的密码打开你的数据库后这个密码就不起作用了,也就是说你不能限定某个用户有权打开 A 表却无权打开 B 表。那么更详细的限定用户操作的方法在哪里哪?身为 access 的高级用户的你会脱口而出“ MDW !”,对了,就是你在菜单 "工具->安全->用户与组权限" 中作的设定,默认情况下你所作的所有操作都保存到系统中的 System.mdw 文件中。
前面说到 2 种 access 权限保护虽然说已经达到一般使用的要求,但是也许是由于 Microsoft 的漏洞,这两种方法都可以用第三方的破解软件成功破解,而且破解的过程非常非常之简单,甚至于电脑初级用户也能随意破解。一旦破解,你存储在表中的一些关键数据,比如说这个数据库用户的用户名、密码、权限设定都暴露了,如果你是使用 C/S 结构以 SQL 为后端的话 ODBC 链接字串暴露了那就更不得了了。破解者就可以用他得到他人账号在你完全无法察觉的情况下篡改或窃取你的数据了
再说一下 access 中的 VBA 密码、VSS 保护以及编译成 MDE 文件的功能,还有加密整个数据库的功能。前三项功能其实都是用来保障你编写的程序的安全的,而后一项是保护你的数据库文件不被他人以二进制方式察看的,我就不再多说了。
好了,对于像你这样的 access 高级用户来说,前面都是废话,非常感谢你耐着性子看完,下面才是关键。
首先声明,我采用的密码保护方式主要是用来保护 ODBC 字串和数据库内用户名及用户密码的——不保护数据库中数据本身。 就如我以前几篇文章中提到过的,我是采用字符位偏移的方法来加密作为密码的字串的,基本思路是将某个密码字串中的每个字符读取出来,然后用 ASC() 函数得到它的内码,然后再偏移 n 位以得到一个新的字符内码,再用 CHR() 函数将其转换出来并组合好后存储到数据库中某个表的 STRING 字段中。基本代码如下:
'以下是登陆部分使用的代码
Dim LogUser As String
LogUser = Nz(姓名.Value) '姓名是一个文本框,用以获取用户名
Dim tbl As DAO.Recordset
Dim strSQLcode As String
strSQLcode = "SELECT 职员表.ID, 职员表.姓名, 职员表.密码 FROM 职员表 WHERE " & _
"(((职员表.姓名)='" & LogUser & "'));"
'职员表 中存储了密码及姓名
Set tbl = CurrentDb.OpenRecordset(strSQLcode, dbOpenDynaset, dbSeeChanges)
If tbl.EOF Or tbl.BOF Then
MsgBox "没有找到该职员: " & LogUser & " 。"
DoCmd.Quit
Exit Sub
Else
If tbl!密码 = CodeIn(Nz(密码.Value)) Then 'CodeIn函数就是做字符位偏移的函数
MsgBox "登陆成功"
End If
End If
'------------------------------------------------------------------------
'以下是更改密码部分使用的代码:
Private Sub CodeF()
On Error GoTo Err_命令3_Click
If 新密码1.Value <> 新密码2.Value Then
MsgBox "请确认新密码输入是否正确,二次输入的密码必须完全一致"
Exit Sub
End If
Dim AUserChange As String
AUserChange = Nz(姓名.Value)
Dim tbl As DAO.Recordset
Set tbl = CurrentDb.OpenRecordset("职员表", dbOpenDynaset)
tbl.MoveLast
tbl.FindFirst "姓名='" & AUserChange & "'"
If tbl.NoMatch Then
MsgBox "没有找到该职员: " & AUserChange & " 。"
Else
If tbl!密码 = CodeIn(密码.Value) Then 'CodeIn函数就是做字符位偏移的函数
tbl.Edit
tbl!密码 = CodeIn(新密码1.Value)
tbl.Update
MsgBox "密码变更成功,以后请使用新密码登陆"
Set tbl = Nothing
DoCmd.Close
Exit Sub
Else
MsgBox "当前密码错误,请确认字母的大小写是否正确。"
End If
End If
Exit_命令3_Click:
Exit Sub
Err_命令3_Click:
MsgBox Err.Description
Resume Exit_命令3_Click
End Sub
'------------------------------------------------------------------------
'以下密码输入位偏移过程
Public Function CodeIn(InputText As String) As String
' 由 VBA 代码注释器和错误处理程序外接程序插入的代码头
'=============================================================
' CodeIn
'-------------------------------------------------------------
' 参数
'-----------
' InputText (String)
'-------------------------------------------------------------
'=============================================================
' 代码头块结束
'以下为头变量:
Dim i As Long
'错误处理代码开始
On Error GoTo Err_CodeIn
For i = 1 To Len(InputText)
CodeIn = CodeIn & Chr(Asc(Right(Left(InputText, i), 1)) + 1)
Debug.Print CodeIn
Next i
Exit_CodeIn:
Exit Function
Err_CodeIn:
MsgBox Err.Description
Resume Exit_CodeIn
' 错误处理块结束。
End Function
当然,我自己现在使用的加密过程更加繁复,我先要求用户输入一个“钥匙”字符串,然后根据钥匙 字符串中随机产生 Long 型变量作为位偏移的量,每一个被处理的字符位偏移范围可以从 -32768 到 65535 (每个字符偏移的具体量是不同的),并且把完成偏移后的字串根据 Long 型变量打乱成乱序,最后将偏移完成后的字串转换成二进制存储到 OLE 字段中,同时把 Long 型变量转换后也存储到数据库的特定地方。因有几家单位的 SQL 服务器链接字串使用我这种简单加密方式,所以不便把源代码放在这里,请大家原谅。但是所用到基本概念与我上述所讲的例子一样,大家可以考虑一下。
最后再写出所用到的函数及模型:Asc/AscB/ChrB/Chr/CByte/CLng/Rnd/LeftB/RightB/Open/Get/GetChunk/AppendChunk/ADO模型
(责任编辑:admin)
- ·ACCESS丢失MDW,还能还原用户与用户组及
- ·【技巧】如何让Access更加安全
- ·Access数据库安全中常见问题汇总
- ·数据库的安全为什么要侧重于网络系统
- ·建立Access数据库的安全门
- ·如何能通过窗体访问表,但不能直接读取
- ·Access 2007 中的用户级安全
- ·如何用二进制方式编辑 MDB 使 ACCESS
- ·Access限制软件30天试用
- ·Access处理加了密码的MDB数据库文件
- ·EXE修改安全级别并启动ACCESS项目
- ·处理加了密码的MDB数据库文件
- ·Access如何解除VBAProject 的口令保护
- ·保护Access 2000数据库的安全
- ·Access数据库安全五招
- ·Access 数据库安全攻防策略