B/S系统USB-KEY(加密锁)认证实现

来源:互联网 发布:sql创建数据库代码 编辑:程序博客网 时间:2024/06/06 20:58

最近由于项目需要,系统需要对用户进行身份认证,经过一番的调研,最后决定选用客户端加密锁认证方式实现,使用的是磐石科技的NT120身份认证锁(客户端需要安装插件)

加密锁中有:

唯一硬件IDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

MD5bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

 

数据库中用户表中增加两个字段:

唯一硬件IDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

MD5bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

硬件ID是唯一的,因此一个用户对应一个加密锁。

实现原理:

首先是加密锁登陆密码认证(加密锁是有密码的),加密锁登陆密码认证成功,读取加密锁中的唯一硬件ID,通过产生的随机数调用加密锁接口得到客户端信息摘要(随机数和MD5进行MD5运算),将硬件ID、客户端摘要、随机数一同发送至服务器端, 服务器端根据硬件ID到数据库中找到对应的MD5,同时服务器端用传递过来的随机数和MD5进行MD5运算,得到服务器端信息摘要,用客户端传递过来的信息摘要和服务器端的信息摘要比较,相同则认证成功!

客户端代码:

<script language="javascript" type="text/javascript">   function dcLogin(){      var form=document.forms("login");      var Digest="0123456789ABCDE";      var rtn;      var sNTPWD=form.edtntupin.value;      if(sNTPWD==""){         alert("登录密码不能为空!");         return false;      }           //查找NT锁      rtn=NT120Client.NTFind();      if(rtn!=0){         alert("没有找到加密锁!");         return false;      }        //打开NT锁      rtn=NT120Client.NTLogin(sNTPWD)      if(rtn!=0){         alert("登录密码出错!");//65代表错误重试次数超过3次         return false;      }      //获取NTHardwareID      var NTHardwareID = "0123456789ABCD";      NTHardwareID = NT120Client.NTGetHardwareID();      if(NTHardwareID==""){         alert("获取硬件序列号失败!");         return false;      }      //进行硬件MD5运算      try{         Digest=NT120Client.NTMD5("<%=(String)session.getAttribute("RandomData")%>");      }catch(ex){         alert("MD5错误");         return false;      }      form.digest.value=Digest;      form.hardwareID.value=NTHardwareID;      form.submit();   }</script>

 服务器端代码:

 

/**    * 用户认证    */public String dcLogin(){      HttpServletRequest request = ServletActionContext.getRequest ();      String RandomStr = (String)request.getSession().getAttribute("RandomData");//获取随机随机数      String cDigest = request.getParameter("digest");//客户端MD5密钥      String sDigest = "";//服务器MD5密钥      String ntID = request.getParameter("hardwareID");//获取硬件ID       try{         //根据ntID得到用户信息(包括MD5值)         UserModel user = userService.getNTIDByMd5(ntID);         if(user != null){            //进行MD5运算            String msg = (RandomStr+user.getUserKey());            MessageDigest md = MessageDigest.getInstance("MD5");            md.update(msg.getBytes("UTF-8"));            byte b[] = md.digest();            int i;            StringBuffer buf = new StringBuffer("");            for(int offset = 0; offset < b.length; offset++) {                i = b[offset];                if(i<0) i+= 256;                if(i<16)                buf.append("0");                buf.append(Integer.toHexString(i));            }            sDigest = buf.toString();            //进行MD5密钥比较,给出相应的服务            if (sDigest.equals(cDigest)){                StaticConstant.USER_TYPE = 1;                log.info("DataCenter User OK!");                request.getSession().setAttribute("user",user);            }else{                message = "用户认证失败,请联系研发人员!";                return INPUT;            }         }else{            message = "用户认证失败,没有对应的用户信息!";            return INPUT;         }      }catch(Exception ex){         ex.printStackTrace();      }      return SUCCESS;   }
 

 

 

0 0
原创粉丝点击