rain
2024-08-17 61b91c80f3d7526eb3caa04e6e781e591f48ec93
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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());
    }
 
}