From 2db1aa88e8ab53096a936163d686b90d8e056a99 Mon Sep 17 00:00:00 2001
From: rain <167982779@qq.com>
Date: Wed, 21 Aug 2024 23:18:33 +0800
Subject: [PATCH] 国土对接返回信息加密

---
 src/main/java/com/dji/sample/droneairport/utils/AuthUtil.java |   54 +++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/src/main/java/com/dji/sample/droneairport/utils/AuthUtil.java b/src/main/java/com/dji/sample/droneairport/utils/AuthUtil.java
index 310ca72..016e3ff 100644
--- a/src/main/java/com/dji/sample/droneairport/utils/AuthUtil.java
+++ b/src/main/java/com/dji/sample/droneairport/utils/AuthUtil.java
@@ -1,25 +1,53 @@
 package com.dji.sample.droneairport.utils;
 
-import com.dji.sample.territory.utils.jym.SM2SignVO;
-import com.dji.sample.territory.utils.jym.SM2SignVerUtils;
-import com.dji.sample.territory.utils.jym.Util;
-import lombok.SneakyThrows;
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.HexUtil;
+import cn.hutool.crypto.asymmetric.SM2;
+
 
 import java.nio.charset.StandardCharsets;
-import java.util.Base64;
+
 
 public class AuthUtil {
 
-    @SneakyThrows
+    /**
+     * 国土调查云获取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 certificateB = "044D6061FC08A19D3F32CEAA8CF6679B40500008FD741FC26DE7E50AEBF3A9115D47274437730EADEDAEF0CCC4853C5F0B35B30C6AEA83A5F6FBCA4ABEAC9E3B98"; // 示例证书信息
-        String C = certificateB + timestamp;
-        byte[] D = C.getBytes(StandardCharsets.UTF_8);
-        SM2SignVO sm2signv0 = SM2SignVerUtils.Sign2SM2(Util.hexStringToBytes("23E57DA1E4AB865CCBC325B668762207DEF74345B782237808AE0BABDF26734D"), D);
-        byte[] E = sm2signv0.getSm2_signForHard().getBytes(StandardCharsets.UTF_8);
-        String F = Base64.getEncoder().encodeToString(E);
-        return certificateB + "." + timestamp + "." + F;
+        //拼接待签名数据
+        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) {

--
Gitblit v1.9.3