CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

请教高手关于判断数据库密码的问题!急,在线等~

楼主jehon(没车步行中。。。)2005-04-02 10:49:09 在 VB / 基础类 提问

VB连ACCESS数据库,在登录界面要输入数据库密码。现在的情况是,我不输数据库密码或输入错误的密码,VB自动调用错误信息,说密码无效。  
  能不能由我来判断我输入的数据库密码跟实际数据库的密码是否匹配?以便由我来指定当错误发生时显示何种提示信息~或进行何种操作?! 问题点数:20、回复次数:12Top

1 楼jehon(没车步行中。。。)回复于 2005-04-02 11:29:38 得分 0

大家帮帮我!:(Top

2 楼chendjin(蹭分来了)回复于 2005-04-02 11:37:08 得分 5

'定义允许用户验证登录信息的最大次数  
  Const   MaxLogTimes   As   Integer   =   3  
   
  Private   Sub   cmdCancel_Click()  
          '请求用户确认是否真的退出系统登录  
          If   MsgBox("你选择了退出系统登录,退出将不能启动管理系统!"   &   vbCrLf   _  
                              &   "是否真的退出?",   vbYesNo,   "登录验证")   =   vbYes   Then  
                  Unload   Me                               '卸载登录窗体  
          End   If  
  End   Sub  
   
  Private   Sub   cmdOk_Click()  
          Dim   intChecked   As   Integer  
          Dim   strName   As   String,   MdbPath   As   String,   strPassword   As   String  
           
          '静态常量intLogTimes用于保存用户请求验证的次数  
          Static   intLogTimes   As   Integer  
          intLogTimes   =   intLogTimes   +   1           '保存登录次数  
          If   intLogTimes   >   MaxLogTimes   Then  
                  '超过允许的登录次数,显示提示信息  
                  MsgBox   "你已经超过允许的登录验证次数!"   &   vbCr   _  
                                &   "应用程序将结束!",   vbCritical,   "登录验证"  
                  End                   '结束应用程序  
          Else  
                  '进一步验证登录信息的合法性  
                  strName   =   Trim(txtLog(0).Text)                     '获得用户名  
                  strPassword   =   Trim(txtLog(1).Text)             '获得口令  
                   
                  '检验用户名和口令的合法性,并根据检验返回值执行相应的操作  
                  MdbPath   =   App.Path   &   "\物管数据库.mdb"  
                  Select   Case   Check_PassWord(MdbPath,   strName,   strPassword)  
                          Case   0  
                                  '用户不是系统用户  
                                  MsgBox   "用户不是系统用户,请检查用户名输入是否正确!",   _  
                                                vbCritical,   "登录验证"  
                                  txtLog(0).SetFocus  
                                  txtLog(0).SelStart   =   0  
                                  txtLog(0).SelLength   =   Len(txtLog(0))  
                          Case   1  
                                  '口令错误  
                                  MsgBox   "口令错误,请重新输入!",   vbCritical,   "登录验证"  
                                  txtLog(1)   =   ""  
                                  txtLog(1).SetFocus  
                          Case   2  
                                  Unload   Me                       '口令正确,卸载登录窗体  
                                  MsgBox   "登录成功,将启动系统程序!",   vbInformation,   "登录验证"  
                                   
                                  '通常在此放置显示系统主窗体的语句,例如  
                                  'frmMain.Show  
                          Case   Else  
                                  '登录验证未正常完成  
                                  MsgBox   "登录验证未正常完成!请重新运行登录程序,"   &   vbCrLf   _  
                                                &   "如果仍不能登录,请报告系统管理员!",   _  
                                                vbCritical,   "登录验证"  
                  End   Select  
          End   If  
  End   Sub  
   
  Private   Function   Check_PassWord(ByVal   MdbPath   As   String,   ByVal   UserName   As   String,   _  
                                                                  ByVal   Password   As   String)   As   Byte  
          On   Error   GoTo   gpError  
          '查询数据库,获得UserName的登录口令  
          Dim   objCn   As   ADODB.Connection  
          Dim   objRs   As   ADODB.Recordset  
          Dim   strCn   As   String,   strSQL   As   String  
           
          Set   objCn   =   New   Connection  
          Set   objRs   =   New   Recordset  
          '建立数据库连接  
          With   objCn  
                  .Provider   =   "Microsoft.Jet.OLEDB.4.0"  
                  .ConnectionString   =   "Data   Source="   &   MdbPath   &   ";"   &   _  
                                                          "Mode=Share   Deny   Read|Share   Deny   Write;Persist   Security   Info=False;"   &   _  
                                                          "Jet   OLEDB:Database   Password="   &   Password   &   ";"  
                  .Open  
          End   With  
           
          '执行查询命令,获得用户登录口令  
          strSQL   =   "SELECT   口令   FROM   系统用户   WHERE   用户名='"   _  
                            &   UserName   &   "'"  
          Set   objRs.ActiveConnection   =   objCn  
          objRs.Open   (strSQL)  
           
          '判断有无查询结果  
          If   objRs.EOF   Then  
                  Check_PassWord   =   0             '没有查询结果,表示该用户为非法用户  
          Else  
                  '检查口令是否正确  
                  If   Password   <>   Trim(objRs.Fields("口令").Value)   Then  
                          Check_PassWord   =   1                     '口令不正确  
                  Else  
                          Check_PassWord   =   2                   '口令正确  
                  End   If  
          End   If  
           
          '关闭数据库连接,释放对象  
          objCn.Close  
          Set   objRs   =   Nothing  
          Set   objCn   =   Nothing  
          Exit   Function  
  gpError:  
          Check_PassWord   =   255  
  End   FunctionTop

3 楼jehon(没车步行中。。。)回复于 2005-04-02 11:42:14 得分 0

我要判断的是数据库的密码,不是系统用户的密码~Top

4 楼zhoujiamurong(有分俺就不要,俺要知识)回复于 2005-04-02 11:47:40 得分 0

用一个用户输入的变量(如text1.text)来生成连接字符串,然后,用这个试着连数据库,如果不行,就说明错误Top

5 楼jehon(没车步行中。。。)回复于 2005-04-02 11:53:25 得分 0

strConn   =   "Provider=Microsoft.Jet.OLEDB.4.0;Data   Source="   &   App.Path   &   "\misdata.mdb;Persist   Security   Info=False;   Jet   OLEDB:Database   Password='"   &   datapw   &   "';"   我就想要判断Database   Password   与   '"   &   datapw   &   "'是不是相等~Top

6 楼yin138(大海)回复于 2005-04-02 12:03:16 得分 0

用这个PW试一个,并设置一个错误句柄,如果不行的话,检查一下ErrNumber,如果是正确的话,程序就可以打开数据库,但是如果错误且是密码错误的话,那就是不相等咯。Top

7 楼jehon(没车步行中。。。)回复于 2005-04-02 12:14:57 得分 0

在我不输数据库密码或输入错误密码的情况下  
  cn.open   strConn   就会弹出一个‘密码无效’的对话框()  
   
  请问如果密码是正确的,cn.open   strConn   返回的是个什么值?如果发生异常,是不是也应该有值返回呢?那我能不能知道它返回的值是什么?Top

8 楼chendjin(蹭分来了)回复于 2005-04-02 12:22:22 得分 10

给你一段获取.mdb密码代码,知道后自己看着办。  
  Option   Explicit  
  Private   Declare   Sub   CopyMemory   Lib   "kernel32"   Alias   "RtlMoveMemory"   (Destination   As   Any,   Source   As   Any,   ByVal   Length   As   Long)  
   
  'fbDirect=True,直接给出密码GetAccessPwd  
  Public   Function   GetAccessPwd(fsDBsee   As   String,   _  
                                                                        fsRetVer   As   String,   _  
                                                                        Optional   fbDirect   As   Boolean   =   True)   As   String  
          Dim   bytVer(2)             As   Byte  
          Dim   bytDB_ID               As   Byte  
          Dim   bytFile(39)         As   Byte  
          Dim   bytDateKey(127)   As   Byte  
          Dim   l                             As   Long  
          Dim   n                             As   Long  
          Dim   iFreeFile             As   Integer  
          Dim   sFileFlag             As   String   *   15  
           
          Dim   sKey2K                   As   String  
          Dim   sKey97                   As   String  
          Dim   bytKey()               As   Byte  
          Dim   bytRslt()             As   Byte  
          Dim   lAscii                   As   Long  
          Dim   lTemp                     As   Long  
          Dim   sPassword             As   String  
           
          On   Error   GoTo   ErrLabel  
           
          iFreeFile   =   FreeFile  
          Open   fsDBsee   For   Binary   As   #iFreeFile  
           
          l   =   LOF(iFreeFile)  
           
          If   l   >   &H140   Then  
              Get   #iFreeFile,   &H43,   bytFile  
              Get   #iFreeFile,   &H9D,   bytVer  
              Get   #iFreeFile,   &H15,   bytDB_ID  
              Get   #iFreeFile,   &H19,   bytDateKey  
              Get   #iFreeFile,   &H5,   sFileFlag  
          End   If  
          Close   #iFreeFile  
           
          If   sFileFlag   <>   "Standard   Jet   DB"   Then  
              sPassword   =   "非ACCESS数据库文件"  
              '实际上,文件开始的0x0001标志也可以做为判断依据  
              GoTo   Endlabel  
          End   If  
           
          sKey2K   =   "3074EC37EBCB9CFA70D128E6A5398A60E21B7B3643FDDFB1C17B13437920B13382EE795B243A7C2A"  
          sKey97   =   "86FBEC375D449CFAC65E28E613"  
           
          If   bytVer(0)   =   0   Then  
              fsRetVer   =   "3.51"  
          Else  
              'Microsoft   似乎想在今后的版本中用该数据表示建立ADO的连接  
              fsRetVer   =   Chr(bytVer(0))   &   Chr(bytVer(1))   &   Chr(bytVer(2))  
          End   If  
           
          fsRetVer   =   IIf(bytDB_ID   =   0,   "ACCESS_97;",   "ACCESS_2K;")   &   fsRetVer  
           
          If   (bytDB_ID   =   1)   And   fbDirect   Then  
              sPassword   =   GetPwdDirect(bytDateKey)  
              If   sPassword   =   ""   Then   sPassword   =   "无密码"  
              GoTo   Endlabel  
          End   If  
           
          If   bytDB_ID   =   1   Then  
          ElseIf   bytDB_ID   =   0   Then  
              bytKey   =   Hex2ByteA(sKey97)  
              For   l   =   0   To   UBound(bytKey)  
                  lAscii   =   bytKey(l)   Xor   bytFile(l)  
                  If   lAscii   <>   0   Then  
                      sPassword   =   sPassword   &   Chr(lAscii)  
                  End   If  
              Next   l  
          Else  
              sPassword   =   "非ACCESS数据库文件"  
          End   If  
           
          If   sPassword   =   ""   Then   sPassword   =   "无密码"  
           
  Endlabel:  
          GetAccessPwd   =   sPassword  
          Exit   Function  
  ErrLabel:  
          GetAccessPwd   =   Err.Description  
  End   Function  
  '实用函数,将16进制的字符串转换成字节型的数组  
  Public   Function   Hex2ByteA(fsData   As   String)   As   Byte()  
          Dim   i   As   Integer  
          Dim   btyTemp()   As   Byte  
           
          If   fsData   =   ""   Then   fsData   =   0  
          If   Len(fsData)   <   2   Then  
              ReDim   btyTemp(0)  
              btyTemp(0)   =   CByte("&H"   &   fsData)  
          Else  
              ReDim   btyTemp(0   To   Len(fsData)   \   2   -   1)  
              For   i   =   0   To   Len(fsData)   \   2   -   1  
                      btyTemp(i)   =   CByte("&H"   &   Mid(fsData,   (i   +   1)   *   2   -   1,   2))  
              Next   i  
          End   If  
          Hex2ByteA   =   btyTemp  
  End   Function  
  Public   Function   GetPwdDirect(fbytFile()   As   Byte)   As   String  
          Dim   l   As   Long  
          Dim   bytEncriptKey(3)   As   Byte   '初始密码  
          Dim   bytEncriptRet(257)   As   Byte  
          Dim   dbl   As   Double  
          Dim   lKey   As   Long  
          Dim   lRslt(19)         As   Long  
          Dim   sPassword   As   String  
           
          bytEncriptKey(0)   =   &HC7  
          bytEncriptKey(1)   =   &HDA  
          bytEncriptKey(2)   =   &H39  
          bytEncriptKey(3)   =   &H6B  
           
          '先直接使用上面的初始密码通过查表的方法形成新的密钥  
          '本函数有点DES算法的味道  
          Call   LoGetEncryptStr(bytEncriptKey,   bytEncriptRet,   4)  
          '利用上面形成的密钥对文件中的加密字串fbytFile进行解密,得到结果bytEncriptRet  
          Call   LoGetKey(bytEncriptRet,   fbytFile,   &H80)  
          '比尔的原版ACCESS算法中,使用了数学协处理器的浮点指令FISTP、FSTCW等,  
          '但我发现,采用CopyMemory方法有种殊途同归的感觉  
          CopyMemory   ByVal   VarPtr(dbl),   ByVal   VarPtr(fbytFile(0))   +   90,   8  
          'lKey是整个过程的关键,如果不是跟踪到核心算法,我是永远猜不透这个数值的来历的。  
          '这就是我先前使用暴力的原因。  
          lKey   =   Int(dbl)  
          For   l   =   0   To   19  
              lRslt(l)   =   fbytFile(l   *   2   +   42)   +   256   *   CLng(fbytFile(l   *   2   +   43))  
              If   l   Mod   2   =   0   Then  
                  lRslt(l)   =   lRslt(l)   Xor   lKey  
              End   If  
              If   lRslt(l)   <>   0   Then  
                  '用ChrW来代替WideCharToMultiByte对Unicode字节进行转换  
                  sPassword   =   sPassword   &   ChrW(lRslt(l))  
              End   If  
          Next   l  
          GetPwdDirect   =   sPassword  
  End   Function  
  '本函数将得到解密用的KEY  
  Private   Function   LoGetEncryptStr(fbytEncriptKey()   As   Byte,   fbytEncriptRet()   As   Byte,   flModeValue   As   Long)  
      Dim   l   As   Long  
      Dim   lTemp1   As   Long  
      Dim   lTemp2   As   Long  
      Dim   lTemp3   As   Long  
      Dim   lTemp4   As   Long  
      Dim   lTemp5   As   Long  
       
      For   l   =   0   To   255  
          fbytEncriptRet(l)   =   l  
      Next   l  
      lTemp1   =   0  
      For   l   =   0   To   255  
            lTemp1   =   lTemp2  
            lTemp1   =   fbytEncriptKey(lTemp1)  
            lTemp4   =   fbytEncriptRet(l)  
            lTemp1   =   lTemp1   +   lTemp4  
            lTemp4   =   lTemp3  
            lTemp1   =   lTemp1   +   lTemp4  
            lTemp1   =   lTemp1   And   &H800000FF  
            lTemp3   =   lTemp1  
            lTemp1   =   fbytEncriptRet(l)  
            lTemp5   =   lTemp1  
            lTemp1   =   lTemp3  
            lTemp1   =   fbytEncriptRet(lTemp1)  
            fbytEncriptRet(l)   =   lTemp1  
            lTemp4   =   lTemp3  
            fbytEncriptRet(lTemp4)   =   lTemp5  
            lTemp1   =   lTemp2  
            lTemp1   =   lTemp1   +   1  
            lTemp4   =   lTemp1   Mod   flModeValue  
            lTemp2   =   lTemp4  
      Next   l  
  End   Function  
  Private   Function   LoGetKey(fbytEncriptKey()   As   Byte,   fbytKeyRet()   As   Byte,   flMaxValue   As   Long)  
        Dim   l   As   Long  
        Dim   lTemp1   As   Long  
        Dim   lTemp2   As   Long  
        Dim   lTemp3   As   Long  
        Dim   lTemp4   As   Long  
        Dim   lTemp5   As   Long  
        Dim   lTemp6   As   Long  
        Dim   lTemp7   As   Long  
        Dim   lTemp8   As   Long  
       
      lTemp4   =   fbytEncriptKey(&H100)  
      lTemp1   =   fbytEncriptKey(&H101)  
         
      For   l   =   1   To   flMaxValue  
          lTemp4   =   lTemp4   +   1  
          lTemp4   =   lTemp4   And   &H800000FF  
          lTemp3   =   lTemp4   And   &HFF  
          lTemp5   =   fbytEncriptKey(lTemp3)  
          lTemp1   =   lTemp1   And   &HFF  
          lTemp5   =   lTemp5   +   lTemp1  
          lTemp1   =   lTemp5   And   &H800000FF  
          lTemp6   =   fbytEncriptKey(lTemp4)  
          lTemp5   =   fbytEncriptKey(lTemp1)  
          fbytEncriptKey(lTemp3)   =   lTemp5  
          lTemp2   =   lTemp1  
          fbytEncriptKey(lTemp2)   =   lTemp6  
          lTemp5   =   fbytEncriptKey(lTemp3)  
          lTemp3   =   fbytEncriptKey(lTemp1   And   &HFF)  
          lTemp5   =   lTemp5   +   lTemp3  
          lTemp5   =   lTemp5   And   &H800000FF  
          lTemp7   =   lTemp5  
          lTemp3   =   lTemp8  
          lTemp5   =   fbytEncriptKey(lTemp5)  
          fbytKeyRet(lTemp3)   =   fbytKeyRet(lTemp3)   Xor   lTemp5  
          lTemp8   =   lTemp8   +   1  
      Next   l  
      fbytEncriptKey(&H100)   =   lTemp4  
      fbytEncriptKey(&H101)   =   lTemp1  
  End   Function  
   
  Private   Sub   Command1_Click()  
      Dim   sFile         As   String  
      Dim   sVersion   As   String  
   
  sFile   =   App.Path   &   "\DATA.mdb"  
  Text1.Text   =   GetAccessPwd(sFile,   sVersion,   True)  
  Text2.Text   =   sVersion  
  End   Sub  
  Top

9 楼dqhuaying(不再留恋)回复于 2005-05-24 09:51:30 得分 0

好深Top

10 楼xuxutj(紫雨)回复于 2005-05-27 14:25:28 得分 0

好强的代码啊Top

11 楼hr88rong(阿榕(http://www.caixiong.com/?69583361.htm))回复于 2005-05-27 17:09:32 得分 0

帮你顶,学习中......Top

12 楼yangfengcl(傷透腦袋)回复于 2005-05-28 11:30:20 得分 5

rs.Open   "select   用戶名,密碼   from   usepass   where   用戶名='"   &   usename.Text   &   "'",   db,   adOpenStatic,   adLockBatchOptimistic  
  If   rs.EOF   =   False   Then  
          If   (IsNull(rs.Fields("密碼"))   And   Text2.Text   =   "")   Or   rs.Fields("密碼")   =   Text2.Text   Then  
                rs.Close  
                db.Close  
                password.Hide  
                main.Show  
                main.Command5.Enabled   =   True  
          Else  
                MsgBox   "密碼不正確,請注意大小寫,重新輸入!",   ,   "登入"  
          End   If  
  Else  
  MsgBox   "用戶名不正確,請重新輸入!",   ,   "登入"  
  End   IfTop

相关问题

  • Ado连接acess2000数据库的密码问题?(在线等待)
  • 如何修改ACCESS数据库的密码——在线等待
  • 500分,在线救破解Sql anywhere 数据库密码。
  • C/S系统连接数据库问题,如何保证数据库密码的安全?再线等待。。。
  • PB数据库密码
  • 判断数据库类型??
  • 菜鸟请教:连接access数据库时如何判断access是否设置了密码?
  • 如何用ADO连接加有密码的ACCESS2002数据库?在线等
  • 如何打开加了密码的ACCESS数据库,在线等待!100分
  • SQL ANYWHERE 忘了数据库密码 怎么办? 急急!!!在线等待。

关键词

  • mp3
  • 密码
  • 数据库
  • 口令
  • 验证
  • 用户
  • ltemp
  • spassword
  • ifreefile
  • fbytencriptret

得分解答快速导航

  • 帖主:jehon
  • chendjin
  • chendjin
  • yangfengcl

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo