package com.dji.sample.droneairport.utils;
|
|
import cn.hutool.core.codec.Base64;
|
import cn.hutool.core.util.HexUtil;
|
import cn.hutool.crypto.asymmetric.SM2;
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
public class AuthUtil {
|
|
/**
|
* 国土调查云获取token
|
* 1、获取当前时间的时间的毫秒时间戳A
|
* 2、用调用方的数字证书B和A进行字符串顺序拼接得到字符串C
|
* 3、获取字符串C的UTF-8字节数组D
|
* 4、采用调用方的私钥,使用SM2签名算法对字节数组D进行签名得到字节数组E
|
* 5、对字节数组E进行base64编码得到字符串F
|
* 6、组装得到token:{B}.{A}.{F}
|
* @return
|
*/
|
public static String getToken() {
|
String privateKey = "00D631FD5615416EAB63D33A9E66E801F95DE840567504210080006081DE877AE3";
|
String publicKey = "04225AACF606D800EA3C2C31FCF8FB161B15F7A8D0460DEB91013D4F228C455E76A2ED8D71BC6525B5DC5CC015C155479D8839950344AEE438A3A6305C90F8269F";
|
SM2 sm2 = new SM2(privateKey, publicKey);
|
sm2.usePlainEncoding();
|
//SM2 token生成
|
String certCode = "UAV32_WHR4E3UAJZTE3KE5IZFDGL7CBU";
|
long timestamp = System.currentTimeMillis();
|
//拼接待签名数据
|
String needSignData = certCode + timestamp;
|
byte[] needSignDataByte = needSignData.getBytes(StandardCharsets.UTF_8);
|
//签名
|
byte[] signData = sm2.sign(needSignDataByte);
|
String signDataHex = HexUtil.encodeHexStr(signData);
|
// System.out.println("sign Hex:" + signDataHex);
|
String signDataBase64 = Base64.encode(signData);
|
// System.out.println("sign Base64:" + signDataBase64);
|
//生成token
|
String token = certCode + "." + timestamp + "." + signDataBase64;
|
// System.out.println("token:" + token);
|
//SM2 token验证
|
boolean rst1 = sm2.verify(needSignDataByte, signData);
|
// System.out.println("verify result:" + rst1);
|
boolean rst2 = sm2.verify(needSignDataByte, HexUtil.decodeHex(signDataHex));
|
// System.out.println("verify result:" + rst2);
|
boolean rst3 = sm2.verify(needSignDataByte, Base64.decode(signDataBase64));
|
// System.out.println("verify result:" + rst3);
|
return certCode + "." + timestamp + "." + signDataBase64;
|
}
|
|
public static void main(String[] args) {
|
System.out.println("token:" + getToken());
|
}
|
|
}
|