epass收集

 前一段时间,做epass1000的初始化和冲击/响应验证的内容,从网上也没找到多少实用性的东西,经过仔细研究飞天公司的给API和文档,终于把问题搞定了,特总结如下,和大家一起分享:

1.     关于冲击/响应身份认证的原理:

认证过程分为两个认证阶段,在两个认证都通过的情况下,系统才认为是合法用户。

第一个验证是,pin码验证:pin码保存再uk内,合法用户知道,该pin码不在网络上传输

第二个验证时,随机数验证:网络上传输一个随机数,uk和服务器分别加密这个随机数,分别得到一个密文,看这两个密文是否匹配

2.     关于冲击/响应身份验证的过程

1.       打开系统页面,插入uk

2.       输入用户的pin码

3.       点击“登陆”或者“识别”等类似触发验证的事件

4.       开始验证……

5.       验证pin码(在uk里面验证,不再网络传输),若不正确,提示用户不是pin码错误,退出系统;若是继续下一步验证

6.       随机数验证,pin码正确后给服务器一个相应,服务器就会发一个随机数s1给客户端。此时,服务器和客户端同时加密这个随机数s1:服务器端用密钥(存在数据库或者文件中)加密这个随机数s1得到一个密文s2;客户端在uk中用两个密钥文件(uk初始化时已经保存uk中,关于初始化问题,下面会有详述)加密这个随机数s1得到密文s3,把s3传回到服务器

7.       检验s2和s3是否完全一样,若一样则是合法用户,不一样则为非法用户

3.     冲击/响应验证的优点

网上很多。

 

4.     初始化和冲击/响应验证的代码分析

Uk初始化和验证的代码分析:对于初始化可分为客户端初始化和服务器端初始化两种;这两种方式的冲击/响应验证都是一样的

 

服务器端初始化:引入名称为Interop.ePasModLib.dll的动态链接库

初始化的主要步骤:创建实例,打开实例,创建key文件所在的目录,创建key文件,由密钥产生两个key文件的内容,把内容分别写入两个key文件,关闭实例

  1. //创建实例
  2.             ePasModLib.ePas1Class epass = new ePasModLib.ePas1Class();
  3.             //CreateContext函数必须首先被调用(相当于加载epass实例)
  4.             epass.CreateContext(0, 0x0200);
  5.             //打开实例
  6.             epass.OpenDevice(1, AppID);
  7.             //创建目录
  8.             di.lID = 0x200;
  9.             di.lFlags = 0;
  10.             epass.CreateDir(0, "", guid, ref di);
  11.             //把当前目录从根目录换到创建的目录(把当前的目录换到id为“0x200”的目录)
  12.             epass.ChangeDir(0, 0x200, "");
  13.             //创建两个Key文件
  14.             fi.lID = 3;
  15.             fi.lFlags = 0;
  16.             fi.lFileSize = 16;
  17.             fi.ucFileType = (byte)0x04;
  18.             fi.ucReadAccess = (byte)0x00;
  19.             fi.ucWriteAccess = (byte)0x00;
  20.             fi.ucCryptAccess = (byte)0x00;
  21.             epass.CreateFile(0, ref fi);
  22.             fi.lID = 4;
  23.             fi.lFlags = 0;
  24.             fi.lFileSize = 16;
  25.             fi.ucFileType = (byte)0x04;
  26.             fi.ucReadAccess = (byte)0x00;
  27.             fi.ucWriteAccess = (byte)0x00;
  28.             fi.ucCryptAccess = (byte)0x00;
  29.             epass.CreateFile(0, ref fi);
  30.             object strKey1 = "";
  31.             object strKey2 = "";
  32.             object strDist = "";
  33.             //密钥,用密钥产生两个key文件
  34.             string strPassword = "esint";
  35.             ePasModLib.HashClass ClaHashClass = new ePasModLib.HashClass();
  36.             ClaHashClass.MD5HMAC("", strPassword, ref strKey1, ref strKey2, ref strDist);
  37.             byte[] Key = hexstr2array((string)strKey1);
  38.             //打开2个Key文件,写入内容
  39.             epass.OpenFile(0x20, 1, ref fi);
  40.             epass.Write(0, 0, Key, 16, out tSize);
  41.             epass.CloseFile();
  42.             Key = hexstr2array((string)strKey2);
  43.             epass.OpenFile(0x20, 2, ref fi);
  44.             epass.Write(0, 0, Key, 16, out tSize);
  45.             epass.CloseFile();
  46.             epass.CloseDevice();

 

客户端初始化:引入classid=clsid:0aa5300d-42fc-42a0-9487-357ccc060a7a的activex控件

初始化的主要步骤:加载实例,打开实例,创建key文件所在的目录,创建key文件,产生第一个key文件内容,写入可以文件,产生第二个可以文件内容,写入key文件,关闭实例

 

  1. '加载打开实例
  2. ePass.GetLibVersion
  3.                 ePass.OpenDevice 1, ""
  4.                 
  5.                  '创建目录和文件
  6.                 epass.CreateDir 0,pName,pGUID,
  7.                 '更改目录
  8.                 ePass.ChangeDir &H20, &H200, ""
  9.             '创建文件
  10.                 epass.CreateFile 0,3,16,4,7,0,1,0
  11.                 epass.CreateFile 0,4,16,4,7,0,1,0
  12.                 '密钥
  13.                 dim key
  14.                 key=”esint”
  15.                  
  16.                 dim strDist 
  17.                 dim pData 
  18.                 pData=""
  19.                 
  20.                 '产生和写key文件
  21.                 epass.Soft_MD5HMAC 0,pData,key,strDist
  22.                 epass.OpenFile &H20,3
  23.                 epass.Write 1,0,0,strDist,16
  24.                 epass.Soft_MD5HMAC 1,pData,key,strDist
  25.                 epass.OpenFile &H20,4
  26.                 epass.Write 1,0,0,strDist,16                    
  27.                 '关闭设备
  28.                 ePass.CloseDevice

验证过程:服务器给客户端传输一个随机数s1; 客户端在uk里面加密得到s2,传回服务器;同时服务器端加密得到s3;对比s2s3是否一样。

客户端加密过程:引入classid=clsid:0aa5300d-42fc-42a0-9487-357ccc060a7a的activex控件

 

 

  1. '打开设备,改变目录
  2. ePass.OpenDevice 1, ""
  3. ePass.ChangeDir &H20, &H200, ""
  4. '验证pin
  5. ePass.VerifyPIN 0, Pin
  6. ePass.OpenFile 0, 3
  7.  'Do HASH-MD5-HMAC compute.
  8. Digest = ePass.HashToken(1,4,document.Form1.random.Value)
  9.  ePass.CloseDevice

 

服务器端加密验证过程:引入名称为Interop.ePasModLib.dll的动态链接库

  1. #region these for MD5_HMAC
  2.             //these for MD5_HMAC
  3.             string ipad = "";
  4.             string opad = "";
  5.             {
  6.                 for (int i = 0; i < 64; i++)
  7.                 {
  8.                     ipad += "6";
  9.                     opad += "//";
  10.                 }
  11.             }
  12.             string Password = userpwd;
  13.             int KLen = Password.Length;
  14.             string iResult = "";
  15.             {
  16.                 for (int i = 0; i < 64; i++)
  17.                 {
  18.                     if (i < KLen)
  19.                         iResult += Convert.ToChar(ipad[i] ^ Password[i]);
  20.                     else
  21.                         iResult += Convert.ToChar(ipad[i]);
  22.                 }
  23.             }
  24.             iResult += clientrandom;
  25.             iResult = fun_MD5(iResult);
  26.             byte[] Test = hexstr2array(iResult);
  27.             iResult = "";
  28.             char[] b = System.Text.Encoding.GetEncoding(1252).GetChars(Test);
  29.             for (int i = 0; i < b.Length; i++)
  30.             {
  31.                 iResult += b[i];
  32.             }
  33.             string oResult = "";
  34.             {
  35.                 for (int i = 0; i < 64; i++)
  36.                 {
  37.                     if (i < KLen)
  38.                         oResult += Convert.ToChar(opad[i] ^ Password[i]);
  39.                     else
  40.                         oResult += Convert.ToChar(opad[i]);
  41.                 }
  42.             }
  43.             oResult += iResult;
  44.             string Result = fun_MD5(oResult).ToUpper();
  45.             if (Object.Equals(Result, clientdigest))
  46.             {
  47. Response.Write("<script language='javascript'>alert('验证通过')</script>");
  48.             }
  49.             else
  50.             {
  51.                 Response.Write("<script language='javascript'>alert('验证未通过')</script>");
  52.             }
  53.             #endregion
  54. string fun_MD5(string str)
  55.         {
  56.             byte[] b = System.Text.Encoding.GetEncoding(1252).GetBytes(str);
  57.             b = new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(b);
  58.             string ret = "";
  59.             for (int i = 0; i < b.Length; i++)
  60.                 ret += b[i].ToString("x").PadLeft(2, '0');
  61.             return ret;
  62.         }
  63. Byte[] hexstr2array(string HexStr)
  64.         {
  65.             string HEX = "0123456789ABCDEF";
  66.             string str = HexStr.ToUpper();
  67.             int len = str.Length;
  68.             byte[] RetByte = new byte[len / 2];
  69.             for (int i = 0; i < len / 2; i++)
  70.             {
  71.                 int NumHigh = HEX.IndexOf(str[i * 2]);
  72.                 int NumLow = HEX.IndexOf(str[i * 2 + 1]);
  73.                 RetByte[i] = Convert.ToByte(NumHigh * 16 + NumLow);
  74.             }
  75.             return RetByte;
  76.         }

注:其中hexstr2array和fun_MD5函数的代码是飞天的例子中的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值