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

一、前言

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

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
以下是一个基本的 C# 示例,演示如何读取 USB 密钥并获取证书和图像: ```csharp using System; using System.Security.Cryptography.X509Certificates; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; namespace UkeyTest { class Program { [DllImport("gclib.dll")] public static extern int GC_GetDllVersion(byte[] pVer); [DllImport("gclib.dll")] public static extern int GC_Init(int iType, int iPort, int iBaud); [DllImport("gclib.dll")] public static extern int GC_UnInit(); [DllImport("gclib.dll")] public static extern int GC_GetCardInfo(byte[] pCardInfo, int iInfoLen); static void Main(string[] args) { // 初始化 USB 密钥 int ret = GC_Init(0, 100, 115200); if (ret != 0) { Console.WriteLine("初始化 USB 密钥失败!Error Code: {0}", ret); return; } // 获取 USB 密钥证书 byte[] certBuf = new byte[4096]; ret = GC_GetCardInfo(certBuf, certBuf.Length); if (ret <= 0) { Console.WriteLine("获取 USB 密钥证书失败!Error Code: {0}", ret); GC_UnInit(); return; } X509Certificate2 cert = new X509Certificate2(certBuf); Console.WriteLine("证书主题:{0}", cert.Subject); Console.WriteLine("证书颁发者:{0}", cert.Issuer); Console.WriteLine("证书有效期:{0} - {1}", cert.NotBefore, cert.NotAfter); // 获取 USB 密钥图像 byte[] imgBuf = new byte[1024 * 1024]; ret = GC_GetCardInfo(imgBuf, imgBuf.Length); if (ret <= 0) { Console.WriteLine("获取 USB 密钥图像失败!Error Code: {0}", ret); GC_UnInit(); return; } Image img = Image.FromStream(new MemoryStream(imgBuf)); Console.WriteLine("图像大小:{0} x {1}", img.Width, img.Height); // 保存 USB 密钥图像到文件 img.Save("ukey_image.jpg", ImageFormat.Jpeg); // 关闭 USB 密钥 GC_UnInit(); } } } ``` 请注意,此示例代码使用的方法和函数来自于 `gclib.dll`,这是一个与 USB 密钥相关的第三方库。因此,在使用此代码之前,请确保您已正确安装了 `gclib.dll` 并将其添加到您的项目引用
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你个佬六

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值