加密锁中有:
唯一硬件ID:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
MD5:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
数据库中用户表中增加两个字段:
唯一硬件ID:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
MD5:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
硬件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;
}
转载于:https://my.oschina.net/cccyb/blog/1526939