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()); } }