epass1000 初始化 验证
前一段时间,做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文件,关闭实例
- //创建实例
- ePasModLib.ePas1Class epass = new ePasModLib.ePas1Class();
- //CreateContext函数必须首先被调用(相当于加载epass实例)
- epass.CreateContext(0, 0x0200);
- //打开实例
- epass.OpenDevice(1, AppID);
- //创建目录
- di.lID = 0x200;
- di.lFlags = 0;
- epass.CreateDir(0, "", guid, ref di);
- //把当前目录从根目录换到创建的目录(把当前的目录换到id为“0x200”的目录)
- epass.ChangeDir(0, 0x200, "");
- //创建两个Key文件
- fi.lID = 3;
- fi.lFlags = 0;
- fi.lFileSize = 16;
- fi.ucFileType = (byte)0x04;
- fi.ucReadAccess = (byte)0x00;
- fi.ucWriteAccess = (byte)0x00;
- fi.ucCryptAccess = (byte)0x00;
- epass.CreateFile(0, ref fi);
- fi.lID = 4;
- fi.lFlags = 0;
- fi.lFileSize = 16;
- fi.ucFileType = (byte)0x04;
- fi.ucReadAccess = (byte)0x00;
- fi.ucWriteAccess = (byte)0x00;
- fi.ucCryptAccess = (byte)0x00;
- epass.CreateFile(0, ref fi);
- object strKey1 = "";
- object strKey2 = "";
- object strDist = "";
- //密钥,用密钥产生两个key文件
- string strPassword = "esint";
- ePasModLib.HashClass ClaHashClass = new ePasModLib.HashClass();
- ClaHashClass.MD5HMAC("", strPassword, ref strKey1, ref strKey2, ref strDist);
- byte[] Key = hexstr2array((string)strKey1);
- //打开2个Key文件,写入内容
- epass.OpenFile(0x20, 1, ref fi);
- epass.Write(0, 0, Key, 16, out tSize);
- epass.CloseFile();
- Key = hexstr2array((string)strKey2);
- epass.OpenFile(0x20, 2, ref fi);
- epass.Write(0, 0, Key, 16, out tSize);
- epass.CloseFile();
- epass.CloseDevice();
客户端初始化:引入classid=clsid:0aa5300d-42fc-42a0-9487-357ccc060a7a 的activex控件
初始化的主要步骤:加载实例,打开实例,创建key文件所在的目录,创建key文件,产生第一个key文件内容,写入可以文件,产生第二个可以文件内容,写入key文件,关闭实例
- '加载打开实例
- ePass.GetLibVersion
- ePass.OpenDevice 1, ""
- '创建目录和文件
- epass.CreateDir 0,pName,pGUID,
- '更改目录
- ePass.ChangeDir &H20, &H200, ""
- '创建文件
- epass.CreateFile 0,3,16,4,7,0,1,0
- epass.CreateFile 0,4,16,4,7,0,1,0
- '密钥
- dim key
- key=”esint”
- dim strDist
- dim pData
- pData=""
- '产生和写key文件
- epass.Soft_MD5HMAC 0,pData,key,strDist
- epass.OpenFile &H20,3
- epass.Write 1,0,0,strDist,16
- epass.Soft_MD5HMAC 1,pData,key,strDist
- epass.OpenFile &H20,4
- epass.Write 1,0,0,strDist,16
- '关闭设备
- ePass.CloseDevice
验证过程:服务器给客户端传输一个随机数s1; 客户端在uk里面加密得到s2,传回服务器;同时服务器端加密得到s3;对比s2和s3是否一样。
客户端加密过程:引入classid=clsid:0aa5300d-42fc-42a0-9487-357ccc060a7a 的activex控件
- '打开设备,改变目录
- ePass.OpenDevice 1, ""
- ePass.ChangeDir &H20, &H200, ""
- '验证pin
- ePass.VerifyPIN 0, Pin
- ePass.OpenFile 0, 3
- 'Do HASH-MD5-HMAC compute.
- Digest = ePass.HashToken(1,4,document.Form1.random.Value)
- ePass.CloseDevice
服务器端加密验证过程:引入名称为Interop.ePasModLib.dll的动态链接库
- #region these for MD5_HMAC
- //these for MD5_HMAC
- string ipad = "";
- string opad = "";
- {
- for (int i = 0; i < 64; i++)
- {
- ipad += "6";
- opad += "//";
- }
- }
- string Password = userpwd;
- int KLen = Password.Length;
- string iResult = "";
- {
- for (int i = 0; i < 64; i++)
- {
- if (i < KLen)
- iResult += Convert.ToChar(ipad[i] ^ Password[i]);
- else
- iResult += Convert.ToChar(ipad[i]);
- }
- }
- iResult += clientrandom;
- iResult = fun_MD5(iResult);
- byte[] Test = hexstr2array(iResult);
- iResult = "";
- char[] b = System.Text.Encoding.GetEncoding(1252).GetChars(Test);
- for (int i = 0; i < b.Length; i++)
- {
- iResult += b[i];
- }
- string oResult = "";
- {
- for (int i = 0; i < 64; i++)
- {
- if (i < KLen)
- oResult += Convert.ToChar(opad[i] ^ Password[i]);
- else
- oResult += Convert.ToChar(opad[i]);
- }
- }
- oResult += iResult;
- string Result = fun_MD5(oResult).ToUpper();
- if (Object.Equals(Result, clientdigest))
- {
- Response.Write("<script language='javascript'>alert('验证通过')</script>");
- }
- else
- {
- Response.Write("<script language='javascript'>alert('验证未通过')</script>");
- }
- #endregion
- string fun_MD5(string str)
- {
- byte[] b = System.Text.Encoding.GetEncoding(1252).GetBytes(str);
- b = new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(b);
- string ret = "";
- for (int i = 0; i < b.Length; i++)
- ret += b[i].ToString("x").PadLeft(2, '0');
- return ret;
- }
- Byte[] hexstr2array(string HexStr)
- {
- string HEX = "0123456789ABCDEF";
- string str = HexStr.ToUpper();
- int len = str.Length;
- byte[] RetByte = new byte[len / 2];
- for (int i = 0; i < len / 2; i++)
- {
- int NumHigh = HEX.IndexOf(str[i * 2]);
- int NumLow = HEX.IndexOf(str[i * 2 + 1]);
- RetByte[i] = Convert.ToByte(NumHigh * 16 + NumLow);
- }
- return RetByte;
- }
注:其中hexstr2array和fun_MD5函数的代码是飞天的例子中的。
epass1000 初始化 验证相关推荐
- Go protobuf
使用protobuf实现节点间通信.编码报文以提高传输效率 protobuf全程Protocol Buffers,是Google开发的一种数据描述语言. protobuf是一种轻便高效的结构化数据存储 ...
- php ci提交表单验证,ci表单验证代码
概述 这是只考虑php对表单数据的接收处理.至于js部分以前会结合validate来讲解下 在解释 CodeIgniter 的数据验证处理之前,让我们先描述一下一般的情况: 一个表单显示了. 你填写并 ...
- php ci 表单校验,表单验证 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档
表单验证详解 CodeIgniter 提供了一个全面的表单验证和数据预处理类以帮助缩减你所写的代码. 概述 在解释 CodeIgniter 的数据验证处理之前,让我们先描述一下一般的情况: 一个表单显 ...
- Blazor验证控件
目录 概述--Blazor ValidationFormState控件 代码和示例 Blazor编辑设置 验证控件 验证器 StringValidator IValidation WeatherFor ...
- Node 中用 ESLint 验证代码
前言 ESLint 我们一般用在项目工程里,用来监督我们的代码格式.风格等: 另外也能用来检验一段代码字符串是不是符合规则. //可以对 code 这个字符串进行验证,例如我们不允许使用 locati ...
- api接口安全验证(sign签名和token验证)
文章目录 背景 api接口安全类型 1.参数篡改 2.未授权用户访问 3.dos攻击 4.重要信息泄露 5.重放攻击 总结 背景 api的常用就不用多说了,在这个网络时代,小到天气信息,大到各种大数据 ...
- 验证随机数案例java_Java实现随机验证码功能实例代码
现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用. 验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行番茄花园xp系统下载提交 ...
- php表单验证_用PHP进行表单验证
php表单验证 In this article you'll construct and validate a simple form using HTML and PHP. The form is ...
- 支付宝二维码脱机认证库测试(linux_x86平台验证)
最近在调试支付宝给提供的二维码脱机认证库,他们给提供了几个文档和 libposoffline.so库文件. 要想在android或linux上做支持支付宝扫码付的应用,必须会调用他们给的二维码脱机认证 ...
最新文章
- gcc中-pthread和-lpthread的区别
- 500分求助,delphi里用standred来配置dbf文件
- Nginx常见的错误及解决方法
- Java、Android注解代码生成(ButterKnife原理、ViewBinding)
- python有道翻译接口翻译页面-tornado框架学习及借用有道翻译api做自动翻译页面...
- linux高级编程补充知识
- JAXB做错了; 尝试Xembly
- Lecture 2: Preliminary Review--Mind Map
- SpringMVC 中设置日期字符串转换格式
- 4月1日,正式对全球科学界开放!
- 同为EA888发动机,迈腾和奥迪A4L,为何差价10万多?
- (紫书,感谢作者)第7章暴力求解法
- Java开发中的基本数据类型有哪些?
- 3389、1433、3306抓鸡原理和工具教程(原理篇)
- HTML分页插件功能实现
- 基于词典方法和机基于器学习方法的中文情感倾向分析(Web)
- 【​观察】中国云计算产业的下半场 京东云正在下一盘怎样的大棋?
- 面剔除 Face culling
- 浅谈最短路径O(n^3)万(蒟)能(蒻)算法——————Floyd《最短路径·O(n^3)Floyd篇》
- 第4章第11节:图表:使用柱形图表制作学生成绩表 [PowerPoint精美幻灯片实战教程]
热门文章
- 信息安全入门必备认证-Security+
- cf#362-C. Lorenzo Von Matterhorn
- 学生成绩管理(链表)c++
- HTC王雪红:风雨彩虹,铿锵玫瑰
- 03/13 17:17:57: Launching 'app' on OPPO PBEM00. Installation did not succeed. The application could
- C++/C 顺时针法则
- 对计算机课画图课的点评,四年级信息技术观摩课教案及评课:我用电脑学画画...
- Linux Shell脚本pause命令
- word的endnote.wordaddins.connect加载项出现问题
- 自定义Hugo的RSS模板