认证流程:
在整个认证过程中,ET99采用冲击响应的认证方式。当需要在网络上验证用户身份时,先由客户端向服务器发出一个验证请求。服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为冲击)。客户端将收到的随机数提供给ET99,由ET99使用该随机数与存储在ET99中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认 为客户端是一个合法用户。 代码示例:package doublefactor.et99;
import ET299jni.CET299;
import ET299jni.IET299;
import ET299jni.RTException;
import com.alibaba.fastjson.JSONObject;
/**
* @Author: xuliang 徐良
* @Date: 2021/6/10 16:28
* @Description:
* @Version v1.0
*/
public class ET99Utils
{
public static void main(String[] args)
{
String ranStr = "fad2cba4eadeefc45496db387bbc6c93";
String pid = "FFC5EB78";
String userPin = "FFFFFFFFFFFFFFFF";
System.out.println(MD5HMAC(pid, userPin, ranStr));
}
/**
* 通过et99生成加密串
*
* @param pid
* @param userPin
* @param randomStr
* @return
*/
public static JSONObject MD5HMAC(String pid, String userPin, String randomStr)
{
JSONObject jsonObject = new JSONObject();
IET299 ET299 = new CET299();
try
{
byte[] tokenDigest = new byte[16];
byte[] ran = randomStr.getBytes("UTF-8");
int[] tokenCount = new int[1];
System.out.println("Try to Find ET299...");
ET299.FindToken(pid.getBytes("UTF-8"), tokenCount);
if (tokenCount[0] != 0) System.out.println("Find ET299!");
System.out.println("Try to open a token...");
ET299.OpenToken(pid.getBytes("UTF-8"), 1);
System.out.println("Open a ET299 success!");
System.out.println("Verify user pin...");
ET299.Verify(0, userPin.getBytes("UTF-8"));
System.out.println("Verify user pin success!");
System.out.println("MD5HMAC generate Token digest...");
// keyID:[in]密钥指示,范围(1—8)
// pucText:[in]待计算的数据,大于 0 小于等于 51 个字节
// textLen:[in]数据长度,大于 0 小于等于 51
// digest:[out]散列结果的数据指针,固定长度 16 个字节。
ET299.MD5HMAC(1, ran, ran.length, tokenDigest);
String tokenDigestStr = byteArrayToHexString(tokenDigest);
System.out.println(tokenDigestStr);
System.out.println("MD5HMAC generate Token digest success!");
System.out.println("Close the opened token...");
ET299.CloseToken();
System.out.println("Close the opened token success!");
jsonObject.put("ok", true);
jsonObject.put("data", tokenDigestStr);
}
catch (RTException e)
{
System.out.println(e.HResult() + ":" + e.getMessage());
jsonObject.put("ok", false);
jsonObject.put("message", "请检查ET99装置是否已插入:" + e.HResult() + ":" + e.getMessage());
}
catch (Exception ex)
{
ex.printStackTrace();
jsonObject.put("ok", false);
jsonObject.put("message", "校验失败");
}
finally
{
ET299.CloseToken();
}
return jsonObject;
}
/*byte数组转换为HexString*/
public static String byteArrayToHexString(byte[] b)
{
StringBuffer sb = new StringBuffer(b.length * 2);
for (int i = 0; i < b.length; i++)
{
int v = b[i] & 0xff;
if (v < 16)
{
sb.append('0');
}
sb.append(Integer.toHexString(v));
}
return sb.toString();
}
}
ET299jni.jar及相关依赖库见:https://download.csdn.net/download/qq_32077121/19553191
资源分享有限,欢迎留言讨论