ET99双重因子验证

认证流程:

ET99双重因子验证

在整个认证过程中,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

资源分享有限,欢迎留言讨论

上一篇:关于JAVA的引用(地址)的一些理解


下一篇:Java对象转jsonobject被截断,分享一点面试小经验