【Ukey】C#或者Java对Ukey的判断操作

来源:互联网 发布:共识网 知乎 编辑:程序博客网 时间:2024/06/06 03:46

一、前言

      在最近接手的项目中,小编接手了吉林省的一个税务相关的项目,既然是给国家政府机关做项目,那么这个项目的安全性指数就比较高。所以从登录的时候就对这个做了限制——使用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 = "";                }            }        }    }}

四、小结

      以前的安全意识基本就停留在账号密码上,其实账号密码不是很保险的,当硬件和软件相结合的时候就是我们安全性的保证。所以这种思考还是可以有的。

福利:关于Ukey的文档和源码

1 0