PHP网站后台使用ukey登录
因为项目需要,所以就去研究了这个后台用ukey登录,也就是必须使用u盘才能进行登录网站后台
下面先放一个淘宝的链接,这个东西就是在他哪买的
https://item.taobao.com/item.htm?_u=81p7of6sd7c7&id=42619542116
资料下载页面
http://www.dgyzt.com/D8_Download.html
php需要下载的资料如下
下载这三个即可里面有对应的文档跟需要的工具跟代码列子
解压出来会得到
里面相关的工具跟代码列子对应各种语言
拿到ukey如何实现后台登录
1、打开开发工具去生成一个锁的种子ID
这是操作步骤,必须要在插入ukey的时候进行。
2、找到对应的代码列子可以直接复制他们的代码让他自动读取
读取的内容包括你设置好的账号密码等等,写入账户密码的工具如下
代码片段,我用到只有自动读取KeyID,也就是上面设置的锁ID
这里是相关代码,可以直接复制过去用,代码在例子里面都能找到,如果无法使用也可以去咨询客服,他们会有技术人员帮你,这点还是很不错的。
<SCRIPT LANGUAGE=javascript> var bConnect=0; function load() { if(frmlogin.KeyID.value!="")return ;//如果已自动登录则退出 //如果是IE10及以下浏览器,则使用AVCTIVEX控件的方式 if(navigator.userAgent.indexOf("MSIE")>0 && !navigator.userAgent.indexOf("opera") > -1) { setTimeout( Handle_IE10, 1000); return ; } try { var s_pnp=new SoftKey3W(); s_pnp.Socket_UK.onopen = function() { bConnect=1;//代表已经连接,用于判断是否安装了客户端服务 setTimeout( login_onclick, 500); } //在使用事件插拨时,注意,一定不要关掉Sockey,否则无法监测事件插拨 s_pnp.Socket_UK.onmessage =function got_packet(Msg) { } s_pnp.Socket_UK.onclose = function() { } setTimeout( err_Connect, 3000);//如果在一定时间内还没有连接成功,就提示要安装服务 } catch(e) { alert(e.name + ": " + e.message); return false; } } var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'); function toHex( n ) { var result = '' var start = true; for ( var i=32; i>0; ) { i -= 4; var digit = ( n >> i ) & 0xf; if (!start || digit != 0) { start = false; result += digitArray[digit]; } } return ( result == '' ? '0' : result ); } function login_onclick() { var url = window.location.host; //判断是否安装了服务程序,如果没有安装提示用户安装 if(bConnect==0) { window.alert ("未能连接服务程序,请确定服务程序是否安装。请访问“"+url+"/SetUp.zip”下载驱动安装即可,复制链接即可下载!");return false; } var DevicePath,ret,n,mylen,ID_1,ID_2; try { //由于是使用事件消息的方式与服务程序进行通讯, //好处是不用安装插件,不分系统及版本,控件也不会被拦截,同时安装服务程序后,可以立即使用,不用重启浏览器 //不好的地方,就是但写代码会复杂一些 var s_simnew1=new SoftKey3W(); //创建UK类 s_simnew1.Socket_UK.onopen = function() { s_simnew1.ResetOrder();//这里调用ResetOrder将计数清零,这样,消息处理处就会收到0序号的消息,通过计数及序号的方式,从而生产流程 } //写代码时一定要注意,每调用我们的一个UKEY函数,就会生产一个计数,即增加一个序号,较好的逻辑是一个序号的消息处理中,只调用我们一个UKEY的函数 s_simnew1.Socket_UK.onmessage =function got_packet(Msg) { var UK_Data = JSON.parse(Msg.data); // alert(Msg.data); if(UK_Data.type!="Process")return ;//如果不是流程处理消息,则跳过 /** * 自动获取uk设置的账号密码跟ukeyid * 要求只获取ukeyid所以没用上,后续需要对换一下switch即可 */ /* switch(UK_Data.order) { case 0: { s_simnew1.FindPort(0);//发送命令取UK的路径 } break;//!!!!!重要提示,如果在调试中,发现代码不对,一定要注意,是不是少了break,这个少了是很常见的错误 case 1: { if( UK_Data.LastError!=0){window.alert ( "未发现加密锁,请插入加密锁");s_simnew1.Socket_UK.close();return false;} DevicePath=UK_Data.return_value;//获得返回的UK的路径 //获取设置在锁中的用户名 //先从地址0读取字符串的长度,使用默认的读密码"FFFFFFFF","FFFFFFFF" s_simnew1.YReadEx(0,1,"ffffffff","ffffffff",DevicePath);//发送命令取UK地址0的数据 } break; case 2: { if( UK_Data.LastError!=0){ window.alert("读数据时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} s_simnew1.GetBuf(0);//发送命令从数据缓冲区中数据 } break; case 3: { if( UK_Data.LastError!=0){ window.alert("调用GetBuf时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} mylen=UK_Data.return_value;//获得返回的数据缓冲区中数据 //再从地址1读取相应的长度的字符串,,使用默认的读密码"FFFFFFFF","FFFFFFFF" s_simnew1.YReadString(1,mylen, "ffffffff", "ffffffff", DevicePath);//发送命令从UK地址1中取字符串 } break; case 4: { if( UK_Data.LastError!=0){ window.alert("读取字符串时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} frmlogin.username.value=UK_Data.return_value;//获得返回的UK地址1的字符串 //获到设置在锁中的用户密码, //先从地址20读取字符串的长度,使用默认的读密码"FFFFFFFF","FFFFFFFF" s_simnew1.YReadEx(20,1,"ffffffff","ffffffff",DevicePath);//发送命令取UK地址20的数据 } break; case 5: { if( UK_Data.LastError!=0){ window.alert("读数据时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} s_simnew1.GetBuf(0);//发送命令从数据缓冲区中数据 } break; case 6: { if( UK_Data.LastError!=0){ window.alert("调用GetBuf时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} mylen=UK_Data.return_value;//获得返回的数据缓冲区中数据 //再从地址21读取相应的长度的字符串,,使用默认的读密码"FFFFFFFF","FFFFFFFF" s_simnew1.YReadString(21,mylen,"ffffffff", "ffffffff", DevicePath);//发送命令从UK地址21中取字符串 } break; case 7: { if( UK_Data.LastError!=0){ window.alert("读取字符串时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} frmlogin.password.value=UK_Data.return_value;//获得返回的UK地址21的字符串 s_simnew1.GetID_1(DevicePath); //发送命令取ID_1 } break; case 8: { if( UK_Data.LastError!=0){ window.alert("返回ID号错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} ID_1=UK_Data.return_value;//获得返回的UK的ID_1 s_simnew1.GetID_2(DevicePath); //发送命令取ID_2 } break; case 9: { if( UK_Data.LastError!=0){ window.alert("取得ID错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} ID_2=UK_Data.return_value;//获得返回的UK的ID_2 frmlogin.KeyID.value=toHex(ID_1)+toHex(ID_2); frmlogin.ukey.value=toHex(ID_1)+toHex(ID_2); frmlogin.KeyID.value=frmlogin.KeyID.value.substr(0,6)+'****'+frmlogin.KeyID.value.substr(10); //!!!!!注意,这里一定要主动提交,不能用提交类型的按钮,否则无法完全处理所有的消息 // frmlogin.submit (); //所有工作处理完成后,关掉Socket s_simnew1.Socket_UK.close(); } break; } */ /** * 自动获取ukeyid * 要求只获取ukeyid所以没用上,如果需要自动获取ukey设置好的账号密码对换一下switch即可 */ switch(UK_Data.order) { case 0: { s_simnew1.FindPort(0);//发送命令取UK的路径 } break;//!!!!!重要提示,如果在调试中,发现代码不对,一定要注意,是不是少了break,这个少了是很常见的错误 case 1: { if( UK_Data.LastError!=0){window.alert ( "未发现加密锁,请插入加密锁");s_simnew1.Socket_UK.close();return false;} DevicePath=UK_Data.return_value;//获得返回的UK的路径 s_simnew1.GetID_1(DevicePath); //发送命令取ID_1 } break; case 2: { if( UK_Data.LastError!=0){ window.alert("返回ID号错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} ID_1=UK_Data.return_value;//获得返回的UK的ID_1 s_simnew1.GetID_2(DevicePath); //发送命令取ID_2 } break; case 3: { if( UK_Data.LastError!=0){ window.alert("取得ID错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} ID_2=UK_Data.return_value;//获得返回的UK的ID_2 frmlogin.KeyID.value=toHex(ID_1)+toHex(ID_2); frmlogin.ukey.value=toHex(ID_1)+toHex(ID_2); frmlogin.KeyID.value=frmlogin.KeyID.value.substr(0,6)+'****'+frmlogin.KeyID.value.substr(10); //!!!!!注意,这里一定要主动提交,不能用提交类型的按钮,否则无法完全处理所有的消息 // frmlogin.submit (); //所有工作处理完成后,关掉Socket s_simnew1.Socket_UK.close(); } break; } } s_simnew1.Socket_UK.onclose = function(){ } return true; } catch (e) { alert(e.name + ": " + e.message); } } function err_Connect() { var url = window.location.host; if(bConnect==1)return ; alert("未能连接服务程序,请确定服务程序是否安装。请访问“"+url+"/SetUp.zip”下载驱动安装即可,复制链接即可下载!"); } function Handle_IE10() { try { var DevicePath,mylen,ret; var s_simnew1; //创建或控件 s_simnew1=new ActiveXObject("Syunew3A.s_simnew3"); DevicePath = s_simnew1.FindPort(0);//'来查找加密锁,0是指查找默认端口的锁 if( s_simnew1.LastError!= 0 ) { window.alert ( "未发现加密锁,请插入加密锁");return false; } else { //获取锁的ID frmlogin.KeyID.value=toHex(s_simnew1.GetID_1(DevicePath))+toHex(s_simnew1.GetID_2(DevicePath)); if( s_simnew1.LastError!= 0 ) { window.alert( "获取ID错误,错误码是"+s_simnew1.LastError.toString()); return false; } // frmlogin.submit (); return true; } } catch(e) { alert(e.name + ": " + e.message+"。可能是没有安装相应的控件或插件"); return false; } } </SCRIPT>
此处是放一个自动安装包到你域名根目录下,当他提示服务没有安装的时候让他下载安装,就不用每次都来烦你为什么不能登录,安装包下面会有说明你选一个改一下名字就可以了放到网站根目录即可
上面的代码片段有一个switch是可以获取设置好的账户密码跟KeyID的,已标注出来,但是因为用不上就注释掉代码了,另外一个是只获取KeyID。
form表单代码如下
<form action="?op=login" id="frmlogin" name="main" method="POST" onSubmit="return check_data()"> <div id="login_box" style="display:none; "> <div id="box_top"></div> <div id="login_area"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td height="20" colspan="2"></td> </tr> <tr> <td width="39%" height="30" align="right">用户姓名:</td> <td width="61%"><input name="username" id="username" type="text" class="input" size="20" style="width:120px" value=""></td> </tr> <tr> <td height="30" align="right">登录密码:</td> <td><input name="password" id="password" type="password" class="input" size="20" style="width:120px"></td> </tr> <tr> <td height="30" align="right">uKey序号:</td> <td><input name="KeyID" id="KeyID" type="text" class="input" size="20" value="" style="width:120px" autocomplete="off"></td> <input type="hidden" name="ukey" id="ukey" value=""> </tr> <tr> <td height="20" colspan="2"></td> </tr> <tr align="center"> <td align="right"></td> <td align="left"><input type="submit" value="登录系统" class="button"></td> </tr> <tr> <td colspan="2" height="40"></td> </tr> <tr> <td colspan="2" height="38" align="center"></td> </tr> </table> </div> <div id="box_bottom"></div> </div> </form>
还有个一个特别需要注意的点
这里必须要加载他的函数,否则可能会无法自动读取,亲身踩出来的坑
在此页面还需要引用一个Syunew3.js文件,代码列子里面能找到
3.进行测试
做好这些工作之后你就可以开始进行测试了,打开你需要验证的登录页面,他应该会提示你 “未能连接服务程序,请确定服务程序是否安装” ,那么想就需要安装一个程序
程序在这里一个是可以设置网址一个是不可以设置网址,可以设置网址的意思就是你插入ukey他会自动打开到你设置好的一个网址,怎么用里面有说明。
然后安装好程序再打开之后,他会自动获取到你的KeyID了如下。
验证的时候你把你生成的KeyID,放到数据库,如何是需要对应用户,那么就在你用户表多建一个字段存放,能自动获取到之后就剩下如何验证了。
如果上面自动获取的代码实在不会可以去咨询客服客服会教你的,里面还有更高级的代码验证,需要的话可以去研究一下。