一、前言
在最近接手的项目中,小编接手了吉林省的一个税务相关的项目,既然是给国家政府机关做项目,那么这个项目的安全性指数就比较高。所以从登录的时候就对这个做了限制——使用Ukey来进行检测。下面小编向大家介绍一下Ukey是什么?Ukey怎么使用?
二、什么是Ukey?
上图就是Ukey,对你没有看错,他张的确实很像一个U盘,但是他又不说U盘。
UKey是一种通过USB (通用串行总线接口)直接与计算机相连、具有密码验证功能、可靠高速的小型存储设备。ukey 是对现行的网络安全体系是一个极为有力的补充,通过中国信息安全测评认证中心认证的网络安全产品.基于可信计算基及智能卡技术把易用性,便携性和最高级别的安全性带给了使用Microsoft IE或Netscape Navigator进行Web访问,在线交易(购物,付款),收发电子邮件,在线聊天交友及表单签名,文件数字签名等操作的用户,保证用户在ukey下的操作不可篡改,抵赖。ukey最大的特点就是安全性高,技术规范一致性强,操作系统兼容性好,携带使用灵活。——百度百科
总结一下呢,Ukey就是一个钥匙,当我们要登录的时候,如果我们输入正确了用户名和密码,但是没有插入配置好的Ukey,就依旧是不能登录。
Ukey的身份验证原理:借鉴andycode
可以应用usbkey进行冲击响应身份认证,替换掉传统的用户名和密码方式,使登录更加安全。其原理如下图所示:

在整个认证过程中,采用冲击响应的认证方式。当需要在网络上验证用户身份时,先由客户端向服务器发出一个验证请求。服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为冲击)。客户端将收到的随机数提供给,由使用该随机数与存储在中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。
三、Ukey怎么使用?
在使用Ukey的之前呢,就需要对Ukey进行配置,要安装Ukey的驱动才可以显示出Ukey的配置界面。小编使用的是海泰方圆的Ukey,由北京海泰方圆科技有限公司制作。
安装好驱动后,当我们插上Ukey就可以显示出来配置的界面:
我们需要配置的有证书管理的信息。
安装完了,我们还需要对ukey进行操作,就需要我们安装“应用安全支撑平台安全客户端控件.exe”,就可以在C盘的windows文件中添加一个Cryp_Ctl.dll的ocx控件。如果是C#开发的话,就需要把这个控件引用进来,当我们判断的时候需要引入这个控件。如图:
操作的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ukey
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
#region 验证Ukey的信息-王雷-2017年4月17日16:40:25
/// <summary>
/// 验证Ukey的信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
accUkeyOperator ukeyOpe = new accUkeyOperator();
string a = ukeyOpe.TestingUKey(accUkey);
//判断返回的ukey信息
if (ukeyOpe.nsrsbh!="")
{
txtShow.Text = ukeyOpe.nsrsbh;
}
MessageBox.Show(a);
}
#endregion
private void timer1_Tick(object sender, EventArgs e)
{
accUkeyOperator ukeyOpe = new accUkeyOperator();
string a = ukeyOpe.TestingUKey(accUkey);
//判断返回的ukey信息
if (ukeyOpe.nsrsbh != "")
{
txtShow.Text = ukeyOpe.nsrsbh;
}
MessageBox.Show(a);
}
}
}
判断Ukey的类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AxCryp_Ctl;
using System.Windows.Forms;
namespace ukey
{
public class accUkeyOperator
{
private AxCryptCtl _accUkey;
public AxCryptCtl accUkey
{
get { return _accUkey; }
set { _accUkey = value; }
}
public string nsrsbh;
#region 检测ukey的操作-王雷-2017年4月17日16:40:08
/// <summary>
/// 检测ukey的操作-王雷-2017年4月17日16:40:08
/// </summary>
/// <param name="accUkey"></param>
public string TestingUKey(AxCryptCtl accUkey)
{
nsrsbh = "";
#region 检测ukey的操作-王雷-2017年4月17日16:40:08
try
{
//1. 检查是否安装ukey驱动
accUkey.CheckKey();
}
catch (Exception)
{
return"请安装USBKEY驱动";
}
//2. 判断是否插入ukey
int ErrCode = accUkey.ErrCode;
if (ErrCode != 0)
{
return accUkey.ErrMsg ;
}
//3.打开密码设备(打开USBKEY)。
accUkey.OpenDevice();
if (accUkey.ErrCode != 0)
{
return accUkey.ErrMsg ;
}
//4.取证书信息(默认使用16进制表示;纳税人识别号 71;)
string signCertstr = "";
accUkey.GetCertInfo(signCertstr, 71);
if (accUkey.ErrCode != 0)
{
return accUkey.ErrMsg ;
}
//5.返回结果判断
if (accUkey.strResult == null || accUkey.strResult == "")
{
//获取信息失败
return "查询结果不存在" ;
}
#endregion
nsrsbh = accUkey.strResult;
return accUkey.ErrMsg ;
}
#endregion
}
}
对于web开发:
<object classid="clsid:3C474273-7F8B-4690-8C34-855C4528658D"
id="CryTool" border="0" width="14" height="14"
style="visibility: none; display: none"> </object>
function checkUkey(){
try {
CryTool.CheckKey();
} catch (e) {
$("#errMsg").css({color:"red"});
$("#errMsg").html("(请安装USBKEY驱动)");
return;
// Dialog.alert(" 错误信息:" + "请安装USBKEY驱动");
}
if (CryTool.ErrCode != 0) {
$("#errMsg").css({color:"red"});
$("#errMsg").html("(请插入UKEY)");
// Dialog.alert(" 错误信息:" + CryTool.ErrMsg);
}else{
CryTool.OpenDevice();
if (CryTool.ErrCode != 0) {
$("#errMsg").css({color:"red"});
$("#errMsg").html(CryTool.ErrMsg);
}else{
signCertstr = "";
CryTool.GetCertInfo(signCertstr, 71);
if (CryTool.ErrCode != 0) {
// Dialog.alert(" 错误信息:" + CryTool.ErrMsg);
$("#errMsg").css({color:"red"});
$("#errMsg").html(CryTool.ErrMsg);
} else {
// alert(signCertstr);
if(CryTool.strResult!=null&&CryTool.strResult!=undefined&&CryTool.strResult!=""){
var nsrsbhTemp = CryTool.strResult;
nsrsbh = nsrsbhTemp;
var url = "inspur.tax.login.Login.cmd?method=checkSfGyUkery";
var params = "nsrsbh="+nsrsbhTemp;
var service = new WebService(url);
service.showLoading = false;
service.run(params);
var flag = service.getText("flag");
if(flag!="0"){
$("input[name=czryDm]").attr("readonly","readonly");
$("input[name=czryDm]").val(nsrsbhTemp);
// nsrsbh = nsrsbhTemp;
}else{
$("input[name=czryDm]").removeAttr("readonly");
}
$("#errMsg").css({color:"blue"});
$("#errMsg").html("(UKEY识别成功)");
}else{
$("input[name=czryDm]").removeAttr("readonly");
nsrsbh = "";
}
}
}
}
}
四、小结
以前的安全意识基本就停留在账号密码上,其实账号密码不是很保险的,当硬件和软件相结合的时候就是我们安全性的保证。所以这种思考还是可以有的。