会员登录 - 用户注册 - 网站地图 Office中国(office-cn.net),专业Office论坛
当前位置:主页 > 技巧 > Access技巧 > 加密解密安全 > 正文

在Access Table中存储密码的安全性

时间:2005-02-05 00:00 来源:office中国 作者:未知 阅读:



论 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)

顶一下
(0)
0%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价: