Quellcode durchsuchen

feature:国密相关初版

xiari vor 1 Jahr
Ursprung
Commit
d432e6aa24
19 geänderte Dateien mit 731 neuen und 86 gelöschten Zeilen
  1. 6 0
      ruoyi-common/ruoyi-common-encrypt/pom.xml
  2. 51 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/GuomiAutoConfiguration.java
  3. 55 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/GuomiSm4Encryptor.java
  4. 182 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/guomi/GuomiApi.java
  5. 6 1
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java
  6. 9 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/Constants.java
  7. 27 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/GuomiProperties.java
  8. 70 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/DecodeTest.java
  9. 62 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/GetToken.java
  10. 77 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/MapUtils.java
  11. 52 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/SHA256Utils.java
  12. 68 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/TestBase.java
  13. 1 0
      ruoyi-common/ruoyi-common-encrypt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  14. 40 2
      ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java
  15. 2 1
      ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java
  16. 5 0
      ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java
  17. 3 0
      ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java
  18. 0 82
      ruoyi-example/ruoyi-demo/src/main/resources/application.yml
  19. 15 0
      ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml

+ 6 - 0
ruoyi-common/ruoyi-common-encrypt/pom.xml

@@ -56,6 +56,12 @@
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-common-redis</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.hnca</groupId>
+            <artifactId>HmacComputing</artifactId>
+            <version>1.0</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 51 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/config/GuomiAutoConfiguration.java

@@ -0,0 +1,51 @@
+package org.dromara.common.encrypt.config;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.hnca.common.utils.HmacComputing;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.encrypt.core.guomi.GuomiApi;
+import org.dromara.common.encrypt.enumd.Constants;
+import org.dromara.common.encrypt.properties.ApiDecryptProperties;
+import org.dromara.common.encrypt.properties.GuomiProperties;
+import org.dromara.common.encrypt.utils.MapUtils;
+import org.dromara.common.encrypt.utils.SHA256Utils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.redis.cache.RedisCache;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.concurrent.TimeUnit;
+
+import static org.dromara.common.encrypt.enumd.Constants.TOKEN_PREFIX;
+
+
+@AutoConfiguration
+@EnableConfigurationProperties(GuomiProperties.class)
+@Slf4j
+public class GuomiAutoConfiguration {
+
+    @Autowired
+    private GuomiProperties config;
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    @Bean
+    public GuomiApi guomiApi(GuomiProperties config, StringRedisTemplate redisTemplate) {
+        return new GuomiApi(config,redisTemplate);
+    }
+
+}

+ 55 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/encryptor/GuomiSm4Encryptor.java

@@ -0,0 +1,55 @@
+package org.dromara.common.encrypt.core.encryptor;
+
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.encrypt.core.EncryptContext;
+import org.dromara.common.encrypt.core.guomi.GuomiApi;
+import org.dromara.common.encrypt.enumd.AlgorithmType;
+import org.dromara.common.encrypt.enumd.EncodeType;
+import org.dromara.common.encrypt.utils.EncryptUtils;
+import org.redisson.api.RedissonClient;
+
+/**
+ * 调用国密平台的sm4算法实现
+ *
+ */
+public class GuomiSm4Encryptor extends AbstractEncryptor {
+
+    // 用不着上下文
+//    private final EncryptContext context;
+
+    private static final GuomiApi guomiApi = SpringUtils.getBean(GuomiApi.class);
+
+    public GuomiSm4Encryptor(EncryptContext context) {
+        super(context);
+//        this.context = context;
+    }
+
+    /**
+     * 获得当前算法
+     */
+    @Override
+    public AlgorithmType algorithm() {
+        return AlgorithmType.GUOMI_SM4;
+    }
+
+    /**
+     * 加密
+     *
+     * @param value      待加密字符串
+     * @param encodeType 加密后的编码格式
+     */
+    @Override
+    public String encrypt(String value, EncodeType encodeType) {
+        return guomiApi.encyptSm4(value);
+    }
+
+    /**
+     * 解密
+     *
+     * @param value      待解密字符串
+     */
+    @Override
+    public String decrypt(String value) {
+        return guomiApi.decyptSm4(value);
+    }
+}

+ 182 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/guomi/GuomiApi.java

@@ -0,0 +1,182 @@
+package org.dromara.common.encrypt.core.guomi;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.hnca.common.utils.HmacComputing;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.encrypt.enumd.Constants;
+import org.dromara.common.encrypt.properties.GuomiProperties;
+import org.dromara.common.encrypt.utils.MapUtils;
+import org.dromara.common.encrypt.utils.SHA256Utils;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+
+import java.time.Duration;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.concurrent.TimeUnit;
+
+import static org.dromara.common.encrypt.enumd.Constants.TOKEN_PREFIX;
+
+@Slf4j
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class GuomiApi {
+
+    private GuomiProperties config;
+
+    public StringRedisTemplate redisTemplate;
+    //获取token 最好存入redis中缓存起来,其他接口调用前都要获取token
+    public String getToken(){
+        ValueOperations<String, String> operation = redisTemplate.opsForValue();
+        String cacheToken = operation.get(Constants.guomi_send_token);
+        if(StringUtils.isNotBlank(cacheToken)) return cacheToken;
+        String appid = config.getAppid();//密码平台
+        String secretKey = config.getSecretKey();//密码平台秘钥
+
+        String url = config.getBaseurl() + config.getTokenurl();
+
+        String paasid = config.getPaasid();//接入平台
+        String passtoken= config.getPasstoken();//接入平台密钥
+        long timeStamp1=new Date().getTime();
+        String SHAString = HmacComputing.getHmacSign((appid+timeStamp1+secretKey),"UTF-8",secretKey,"HmacSHA256");
+        String nonce = String.valueOf((int)(Math.random()*36));
+        JSONObject params=new JSONObject();
+        String headerTimeStamp = String.valueOf(Calendar.getInstance().getTimeInMillis()/1000);
+        String signature = SHA256Utils.getSHA256StrJava(headerTimeStamp+passtoken+nonce+headerTimeStamp);
+        params.put("appId",appid);
+        params.put("timeStamp",timeStamp1);
+        params.put("hmacStr",SHAString);
+        String body = JSON.toJSONString(params);
+        HttpRequest request = HttpRequest.post(url)
+            .header("Content-Type","application/json")
+            .header("X-Tif-Paasid",paasid)
+            .header("X-Tif-Nonce",nonce)
+            .header("X-Tif-Timestamp",headerTimeStamp)
+            .header("X-Tif-Signature",signature)
+            .body(body);
+        log.info("请求国密token:{}",request.toString());
+        HttpResponse result = request.execute();
+        log.info("请求国密token返回:{}", result.toString());
+        String resBody = result.body();
+        LinkedHashMap<String, Object> resultLinked = MapUtils.stringTransformMap(resBody);
+        Object code = resultLinked.get("code");
+        if(code !=null && StringUtils.equals("200",code.toString())){
+            Object data = resultLinked.get("data");
+            String token = TOKEN_PREFIX+data.toString();
+            //将token 存入redis中
+            redisTemplate.opsForValue().set(Constants.guomi_send_token,token, 3500, TimeUnit.DAYS);
+//            RedisUtils.setCacheObject(Constants.guomi_send_token,token, Duration.ofDays(350));
+            return token;
+        }
+        log.error("国密请求token错误,返回body的信息:{}", resBody);
+        return null;
+    }
+
+    //sm4加密
+    public String encyptSm4(String originStr){
+        if(StringUtils.isBlank(originStr)) return null;
+        String token = getToken();
+        if(StringUtils.isBlank(token)) {
+            log.error("国密请求SM4加密接口错误,token为空");
+            return null;
+        }
+        JSONObject params=new JSONObject();
+        params.put("keyIndex",config.getIndex());
+        params.put("plainText", Base64.encode(originStr.getBytes()));
+        params.put("algorithm", "SM4");
+        String body = JSON.toJSONString(params);
+
+        String paasid = config.getPaasid();//接入平台
+        String passtoken= config.getPasstoken();//接入平台密钥
+        String nonce = String.valueOf((int)(Math.random()*36));
+        String headerTimeStamp = String.valueOf(Calendar.getInstance().getTimeInMillis()/1000);
+        String signature = SHA256Utils.getSHA256StrJava(headerTimeStamp+passtoken+nonce+headerTimeStamp);
+
+        String url = config.getBaseurl() + config.getSm4encrypt();
+        HttpRequest request = HttpRequest.post(url)
+            .header("Content-Type","application/json")
+            .header("X-Tif-Paasid",paasid)
+            .header("X-Tif-Nonce",nonce)
+            .header("X-Tif-Timestamp",headerTimeStamp)
+            .header("X-Tif-Signature",signature)
+            .header("Authorization",token)
+            .body(body);
+
+        log.info("请求SM4加密接口-请求信息:{}",request.toString());
+        HttpResponse result = request.execute();
+        log.info("请求SM4加密接口-响应信息:{}",result.toString());
+
+        String resBody = result.body();
+        LinkedHashMap<String, Object> resultLinked = MapUtils.stringTransformMap(resBody);
+        Object code = resultLinked.get("code");
+        if(code !=null && StringUtils.equals("200",code.toString())){
+            LinkedHashMap<String, Object> res = (LinkedHashMap<String, Object>) resultLinked.get("data");
+            return (String)res.get("encryptedData");
+        }
+
+        log.error("国密请求SM4加密接口错误,返回body的信息:{}", resBody);
+
+        return originStr;
+    }
+
+    //sm4解密
+    public String decyptSm4(String encyptString){
+        if(StringUtils.isBlank(encyptString)) return null;
+        String token = getToken();
+        if(StringUtils.isBlank(token)) {
+            log.error("国密请求SM4解密接口错误,token为空");
+            return null;
+        }
+        JSONObject params=new JSONObject();
+        params.put("keyIndex",config.getIndex());
+        params.put("encryptedData",encyptString);
+        params.put("algorithm", "SM4");
+        String body = JSON.toJSONString(params);
+
+        String paasid = config.getPaasid();//接入平台
+        String passtoken= config.getPasstoken();//接入平台密钥
+        String nonce = String.valueOf((int)(Math.random()*36));
+        String headerTimeStamp = String.valueOf(Calendar.getInstance().getTimeInMillis()/1000);
+        String signature = SHA256Utils.getSHA256StrJava(headerTimeStamp+passtoken+nonce+headerTimeStamp);
+        String url = config.getBaseurl()+config.getSmt4decrypt();
+
+        HttpRequest request = HttpRequest.post(url)
+            .header("Content-Type","application/json")
+            .header("X-Tif-Paasid",paasid)
+            .header("X-Tif-Nonce",nonce)
+            .header("X-Tif-Timestamp",headerTimeStamp)
+            .header("X-Tif-Signature",signature)
+            .header("Authorization",token)
+            .body(body);
+
+        log.info("请求SM4解密接口-请求信息:{}",request.toString());
+        HttpResponse result = request.execute();
+        log.info("请求SM4解密接口-响应信息:{}",result.toString());
+
+        String resBody = result.body();
+        LinkedHashMap<String, Object> resultLinked = MapUtils.stringTransformMap(resBody);
+        Object code = resultLinked.get("code");
+        if(code !=null && StringUtils.equals("200",code.toString())){
+            LinkedHashMap<String, Object> res = (LinkedHashMap<String, Object>) resultLinked.get("data");
+            String plainText = (String)res.get("plainText");
+            return Base64.decodeStr(plainText);
+        }
+
+        log.error("国密请求SM4加密接口错误,返回body的信息:{}", resBody);
+
+        return encyptString;
+    }
+}

+ 6 - 1
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/AlgorithmType.java

@@ -42,7 +42,12 @@ public enum AlgorithmType {
     /**
      * sm4
      */
-    SM4(Sm4Encryptor.class);
+    SM4(Sm4Encryptor.class),
+
+    /**
+     * 国密sm4
+     */
+    GUOMI_SM4(GuomiSm4Encryptor.class);
 
     private final Class<? extends AbstractEncryptor> clazz;
 }

+ 9 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/enumd/Constants.java

@@ -0,0 +1,9 @@
+package org.dromara.common.encrypt.enumd;
+
+public class Constants {
+
+
+    public static final String TOKEN_PREFIX = "Bearer ";
+
+    public static final String guomi_send_token = "guomi_send_token";
+}

+ 27 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/properties/GuomiProperties.java

@@ -0,0 +1,27 @@
+package org.dromara.common.encrypt.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 国密配置
+ */
+@Data
+@ConfigurationProperties(prefix = "guomi")
+public class GuomiProperties {
+
+    private String baseurl;
+
+    private String tokenurl;
+
+    private String sm4encrypt;
+    private String smt4decrypt;
+    private String signraw;
+    private String verifyraw;
+    private String hmac;
+    private String paasid;
+    private String passtoken;
+    private String appid;
+    private String secretKey;
+    private String index;
+}

+ 70 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/DecodeTest.java

@@ -0,0 +1,70 @@
+package org.dromara.common.encrypt.utils;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.dromara.common.core.utils.StringUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.LinkedHashMap;
+
+import static org.dromara.common.encrypt.enumd.Constants.TOKEN_PREFIX;
+
+
+public class DecodeTest {
+
+    public static void main(String[] args) {
+        //解密
+        // http://59.231.12.3/ebus/dzrz/typicalCrypt/crypt/v1/symmetricDecrypt
+        JSONObject params=new JSONObject();
+        params.put("keyIndex","80");
+        params.put("encryptedData","qzTThldKw4sDZoZFYDZRcw==");
+        params.put("algorithm", "SM4");
+        String body = JSON.toJSONString(params);
+
+        String paasid = "yktxt";//接入平台
+        String passtoken="k9eu342motOg5plwDn5yntoKY9TwS8ja";//接入平台密钥
+        String timeStamp =String.valueOf(Calendar.getInstance().getTimeInMillis());
+        System.out.println(timeStamp);
+        long timeStamp1=new Date().getTime();
+        System.out.println(timeStamp1);
+        String nonce = String.valueOf((int)(Math.random()*36));
+        String headerTimeStamp = String.valueOf(Calendar.getInstance().getTimeInMillis()/1000);
+        String signature = SHA256Utils.getSHA256StrJava(headerTimeStamp+passtoken+nonce+headerTimeStamp);
+
+        //String auth = TOKEN_PREFIX+ "";
+        HttpRequest request = HttpRequest.post("http://rio.xinchuangyun.cn/ebus/dzrz/typicalCrypt/crypt/v1/symmetricDecrypt")
+                .header("Content-Type","application/json")
+                .header("X-Tif-Paasid",paasid)
+                .header("X-Tif-Nonce",nonce)
+                .header("X-Tif-Timestamp",headerTimeStamp)
+                .header("X-Tif-Signature",signature)
+                .header("Authorization",TOKEN_PREFIX+"eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjIwMjE3MzEyMDAsInVzZXIiOiJ7XCJpZFwiOlwiN0lyMGQwaEl4N1hiVjlvOVwiLFwibmFtZVwiOlwi5LiA5Y2h6YCa57O757ufXCIsXCJ0eXBlXCI6XCJBY2Nlc3NcIn0ifQ.mZZ1WSFwyFX060N0ZaSGdwcR8svcE7b2yPx-oE9Rpmw")
+                .body(body);
+        System.out.println("请求");
+        System.out.println(request);
+        HttpResponse result = request.execute();
+        System.out.println("返回");
+        System.out.println(result);
+
+        //"/urnKfFOwydSO3/h/LGXyrrv/QX7fUcS+JIXeZP6fSs="
+
+        String resBody = result.body();
+        LinkedHashMap<String, Object> resultLinked = MapUtils.stringTransformMap(resBody);
+        Object code = resultLinked.get("code");
+        if(code !=null && StringUtils.equals("200",code.toString())){
+            LinkedHashMap<String, Object> res = (LinkedHashMap<String, Object>) resultLinked.get("data");
+            String plainText = (String)res.get("plainText");
+            System.err.println(plainText);
+            System.err.println(Base64.encode("432502198912308326".getBytes()));
+            String s = Base64.decodeStr(plainText);
+            System.err.println(s);
+            System.err.println("432502198912308326".equals(s));
+        }
+
+    }
+
+}

+ 62 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/GetToken.java

@@ -0,0 +1,62 @@
+package org.dromara.common.encrypt.utils;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.hnca.common.utils.HmacComputing;
+import org.dromara.common.core.utils.StringUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.LinkedHashMap;
+
+public class GetToken {
+
+    public static void main(String args[]) {
+
+
+        String appid = "7Ir0d0hIx7XbV9o9";//密码平台
+        String secretKey = "Imh6doaoksSK";//密码平台秘钥
+
+
+        String paasid = "yktxt";//接入平台
+        String passtoken="k9eu342motOg5plwDn5yntoKY9TwS8ja";//接入平台密钥
+//        long timeStamp =Calendar.getInstance().getTimeInMillis();
+        String timeStamp =String.valueOf(Calendar.getInstance().getTimeInMillis());
+        System.out.println(timeStamp);
+        long timeStamp1=new Date().getTime();
+        System.out.println(timeStamp1);
+        String SHAString = HmacComputing.getHmacSign((appid+timeStamp1+secretKey),"UTF-8",secretKey,"HmacSHA256");
+        String nonce = String.valueOf((int)(Math.random()*36));
+        JSONObject params=new JSONObject();
+        String headerTimeStamp = String.valueOf(Calendar.getInstance().getTimeInMillis()/1000);
+        String signature = SHA256Utils.getSHA256StrJava(headerTimeStamp+passtoken+nonce+headerTimeStamp);
+        params.put("appId",appid);
+        params.put("timeStamp",timeStamp1);
+        params.put("hmacStr",SHAString);
+        HttpRequest request =   HttpRequest.post("http://rio.xinchuangyun.cn/ebus/dzrz/auth/token")
+                .header("Content-Type","application/json")
+                .header("X-Tif-Paasid",paasid)
+                .header("X-Tif-Nonce",nonce)
+                .header("X-Tif-Timestamp",headerTimeStamp)
+                .header("X-Tif-Signature",signature)
+                .body(JSON.toJSONString(params));
+        System.out.println("请求");
+        System.out.println(request);
+        HttpResponse result = request.execute();
+        System.out.println("返回");
+        System.out.println(result);
+        //{"code":200,"msg":"success!","data":"eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE5NDM4ODQ4MDAsInVzZXIiOiJ7XCJpZFwiOlwib3BMMmNXcEswZzNaR0haOVwiLFwibmFtZVwiOlwi5rmW5Y2X55yB5aeU5YWa5qCh56CU56m255Sf566h55CG57O757ufXCIsXCJ0eXBlXCI6XCJBY2Nlc3NcIn0ifQ.6lvkC5NVMb232qtnzd37f9rHuKhQSlfZJyLIVAiMGUU","description":null}
+        String resBody = result.body();
+        LinkedHashMap<String, Object> resultLinked = MapUtils.stringTransformMap(resBody);
+        Object code = resultLinked.get("code");
+        if(code !=null && StringUtils.equals("200",code.toString())){
+            Object data = resultLinked.get("data");
+            System.err.println(data.toString());
+        }
+    }
+
+
+
+}

+ 77 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/MapUtils.java

@@ -0,0 +1,77 @@
+package org.dromara.common.encrypt.utils;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @Author: panchichun
+ * @Date: 2021/3/16
+ * @Description:
+ */
+@Slf4j
+public class MapUtils {
+
+    /**
+     * string转LinkedHashMap
+     * @param body
+     * @return
+     */
+    public static LinkedHashMap<String,Object> stringTransformMap(String body){
+        LinkedHashMap<String,Object> result = new LinkedHashMap<String,Object>();
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            result = mapper.readValue(body, new TypeReference<LinkedHashMap<String, Object>>() {
+            });
+            return result;
+        } catch (JsonParseException e) {
+            log.error("MapUtils=============>stringTransformMap========JsonParseException=======>", e);
+        } catch (JsonMappingException e) {
+            log.error("MapUtils=============>stringTransformMap========JsonMappingException=======>", e);
+        } catch (IOException e) {
+            log.error("MapUtils=============>stringTransformMap========IOException=======>", e);
+        }
+        return result;
+    }
+
+
+    /**
+     * 对象转map
+     * @param object
+     * @return
+     */
+    public static Map<String, Object> convertBeanToMap(Object object)
+    {
+        if(object == null){
+            return null;
+        }
+        Map<String, Object> map = new HashMap<>();
+        try {
+            BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass());
+            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+            for (PropertyDescriptor property : propertyDescriptors) {
+                String key = property.getName();
+                if (!key.equals("class")) {
+                    Method getter = property.getReadMethod();
+                    Object value = getter.invoke(object);
+                    map.put(key, value);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return map;
+    }
+}

+ 52 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/SHA256Utils.java

@@ -0,0 +1,52 @@
+package org.dromara.common.encrypt.utils;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * SHA256 摘要算法工具类
+ *
+ */
+public class SHA256Utils {
+
+    /**
+     * 利用java原生的摘要实现SHA256加密
+     *
+     * @param str 加密后的报文
+     * @return
+     */
+    public static String getSHA256StrJava(String str) {
+        MessageDigest messageDigest;
+        String encodeStr = "";
+        try {
+            messageDigest = MessageDigest.getInstance("SHA-256");
+            messageDigest.update(str.getBytes(StandardCharsets.UTF_8));
+            encodeStr = byte2Hex(messageDigest.digest());
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return encodeStr;
+    }
+
+    /**
+     * 将byte转为16进制
+     *
+     * @param bytes
+     * @return
+     */
+    private static String byte2Hex(byte[] bytes) {
+        StringBuffer stringBuffer = new StringBuffer();
+        String temp = null;
+        for (int i = 0; i < bytes.length; i++) {
+            temp = Integer.toHexString(bytes[i] & 0xFF);
+            if (temp.length() == 1) {
+                //1得到一位的进行补0操作
+                stringBuffer.append("0");
+            }
+            stringBuffer.append(temp);
+        }
+        return stringBuffer.toString();
+    }
+
+}

+ 68 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/TestBase.java

@@ -0,0 +1,68 @@
+package org.dromara.common.encrypt.utils;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.dromara.common.core.utils.StringUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.LinkedHashMap;
+
+import static org.dromara.common.encrypt.enumd.Constants.TOKEN_PREFIX;
+
+
+public class TestBase {
+
+    public static void main(String[] args) {
+        JSONObject params=new JSONObject();
+        params.put("keyIndex","80");
+        params.put("plainText",Base64.encode("432502198912308326".getBytes()));
+        //params.put("plainText","432502198912308326");
+        params.put("algorithm", "SM4");
+        String body = JSON.toJSONString(params);
+
+
+
+        String paasid = "yktxt";//接入平台
+        String passtoken="k9eu342motOg5plwDn5yntoKY9TwS8ja";//接入平台密钥
+//        long timeStamp =Calendar.getInstance().getTimeInMillis();
+        String timeStamp =String.valueOf(Calendar.getInstance().getTimeInMillis());
+        System.out.println(timeStamp);
+        long timeStamp1=new Date().getTime();
+        System.out.println(timeStamp1);
+        String nonce = String.valueOf((int)(Math.random()*36));
+        String headerTimeStamp = String.valueOf(Calendar.getInstance().getTimeInMillis()/1000);
+        String signature = SHA256Utils.getSHA256StrJava(headerTimeStamp+passtoken+nonce+headerTimeStamp);
+
+        //String auth = TOKEN_PREFIX+ "";
+        HttpRequest request = HttpRequest.post("http://rio.xinchuangyun.cn/ebus/dzrz/typicalCrypt/crypt/v1/symmetricEncrypt")
+                .header("Content-Type","application/json")
+                .header("X-Tif-Paasid",paasid)
+                .header("X-Tif-Nonce",nonce)
+                .header("X-Tif-Timestamp",headerTimeStamp)
+                .header("X-Tif-Signature",signature)
+                .header("Authorization",TOKEN_PREFIX+"eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjIwMjE3MzEyMDAsInVzZXIiOiJ7XCJpZFwiOlwiN0lyMGQwaEl4N1hiVjlvOVwiLFwibmFtZVwiOlwi5LiA5Y2h6YCa57O757ufXCIsXCJ0eXBlXCI6XCJBY2Nlc3NcIn0ifQ.mZZ1WSFwyFX060N0ZaSGdwcR8svcE7b2yPx-oE9Rpmw")
+                .body(body);
+        System.out.println("请求");
+        System.out.println(request);
+        HttpResponse result = request.execute();
+        System.out.println("返回");
+        System.out.println(result);
+
+        // CtW0/MAifUS9lLTQIDt0aEkdf35RCxSTZXicoRT6p34=
+
+        String resBody = result.body();
+        LinkedHashMap<String, Object> resultLinked = MapUtils.stringTransformMap(resBody);
+        Object code = resultLinked.get("code");
+        if(code !=null && StringUtils.equals("200",code.toString())){
+            LinkedHashMap<String, Object> res = (LinkedHashMap<String, Object>) resultLinked.get("data");
+            String encryptedData = (String)res.get("encryptedData");
+            System.err.println("/urnKfFOwydSO3/h/LGXyrrv/QX7fUcS+JIXeZP6fSs=".equals(encryptedData));
+        }
+
+    }
+
+}

+ 1 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -1,2 +1,3 @@
 org.dromara.common.encrypt.config.EncryptorAutoConfiguration
 org.dromara.common.encrypt.config.ApiDecryptAutoConfiguration
+org.dromara.common.encrypt.config.GuomiAutoConfiguration

+ 40 - 2
ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestEncryptController.java

@@ -1,8 +1,12 @@
 package org.dromara.demo.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.encrypt.core.guomi.GuomiApi;
+import org.dromara.demo.domain.TestDemo;
 import org.dromara.demo.domain.TestDemoEncrypt;
 import org.dromara.demo.mapper.TestDemoEncryptMapper;
+import org.dromara.demo.mapper.TestDemoMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.validation.annotation.Validated;
@@ -11,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 
@@ -26,6 +31,12 @@ public class TestEncryptController {
 
     @Autowired
     private TestDemoEncryptMapper mapper;
+    @Autowired
+    private TestDemoMapper mapper1;
+
+    @Autowired
+    private GuomiApi guomiApi;
+
     @Value("${mybatis-encryptor.enable}")
     private Boolean encryptEnable;
 
@@ -36,11 +47,11 @@ public class TestEncryptController {
      * @param value 测试value
      */
     @GetMapping()
-    public R<Map<String, TestDemoEncrypt>> test(String key, String value) {
+    public R<Map<String, Object>> test(String key, String value) {
         if (!encryptEnable) {
             throw new RuntimeException("加密功能未开启!");
         }
-        Map<String, TestDemoEncrypt> map = new HashMap<>(2);
+        Map<String, Object> map = new HashMap<>(2);
         TestDemoEncrypt demo = new TestDemoEncrypt();
         demo.setTestKey(key);
         demo.setValue(value);
@@ -48,6 +59,33 @@ public class TestEncryptController {
         map.put("加密", demo);
         TestDemoEncrypt testDemo = mapper.selectById(demo.getId());
         map.put("解密", testDemo);
+
+        LambdaQueryWrapper<TestDemoEncrypt> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TestDemoEncrypt::getValue, "李四1"); // 使用lambda工具类查询时不会自动加密
+        List<TestDemoEncrypt> testDemoList = mapper.selectList(queryWrapper);
+        map.put("解密1", testDemoList);
+
+        map.put("解密2", mapper.queryById(demo.getId()));
+
+        TestDemo demo1 = new TestDemo();
+        demo1.setId(demo.getId());
+        map.put("解密3", mapper1.selectListEncrypt(demo1));
+
+
+        return R.ok(map);
+    }
+
+    @GetMapping("/testGuomi")
+    public R<Map<String, Object>> testGuomi(String param) {
+        Map<String, Object> map = new HashMap<>(3);
+        map.put("明文", param);
+
+        String s = guomiApi.encyptSm4(param);
+        map.put("加密", s);
+
+        map.put("解密", guomiApi.decyptSm4(s));
+
+
         return R.ok(map);
     }
 

+ 2 - 1
ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/domain/TestDemoEncrypt.java

@@ -23,7 +23,8 @@ public class TestDemoEncrypt extends TestDemo {
      */
     // @EncryptField // 什么也不写走默认yml配置
     // @EncryptField(algorithm = AlgorithmType.SM4, password = "10rfylhtccpuyke5")
-    @EncryptField(algorithm = AlgorithmType.AES, password = "10rfylhtccpuyke5")
+//    @EncryptField(algorithm = AlgorithmType.AES, password = "10rfylhtccpuyke5")
+    @EncryptField(algorithm = AlgorithmType.GUOMI_SM4)
     private String value;
 
 }

+ 5 - 0
ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java

@@ -1,5 +1,6 @@
 package org.dromara.demo.mapper;
 
+import org.apache.ibatis.annotations.Select;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.demo.domain.TestDemoEncrypt;
 
@@ -10,4 +11,8 @@ import org.dromara.demo.domain.TestDemoEncrypt;
  */
 public interface TestDemoEncryptMapper extends BaseMapperPlus<TestDemoEncrypt, TestDemoEncrypt> {
 
+
+    @Select("select * from test_demo where id = #{id}")
+    TestDemoEncrypt queryById(Long id);
+
 }

+ 3 - 0
ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java

@@ -8,6 +8,7 @@ import org.dromara.common.mybatis.annotation.DataColumn;
 import org.dromara.common.mybatis.annotation.DataPermission;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.demo.domain.TestDemo;
+import org.dromara.demo.domain.TestDemoEncrypt;
 import org.dromara.demo.domain.vo.TestDemoVo;
 import org.apache.ibatis.annotations.Param;
 
@@ -56,4 +57,6 @@ public interface TestDemoMapper extends BaseMapperPlus<TestDemo, TestDemoVo> {
         @DataColumn(key = "userName", value = "user_id")
     })
     int deleteByIds(@Param(Constants.COLL) Collection<?> idList);
+
+    List<TestDemoEncrypt> selectListEncrypt(@Param("demo") TestDemo demo);
 }

+ 0 - 82
ruoyi-example/ruoyi-demo/src/main/resources/application.yml

@@ -32,85 +32,3 @@ spring:
       - optional:nacos:application-common.yml
       - optional:nacos:ruoyi-resource.yml
       - optional:nacos:datasource.yml
-
---- # 数据源设置 需在 system 数据源下 执行 test.sql 文件
-spring:
-  datasource:
-    dynamic:
-      seata: false
-      # 设置默认的数据源或者数据源组,默认值即为 master
-      primary: master
-      datasource:
-        # 主库数据源
-        master:
-          type: ${spring.datasource.type}
-          driver-class-name: com.mysql.cj.jdbc.Driver
-          url: ${datasource.system-master.url}
-          username: ${datasource.system-master.username}
-          password: ${datasource.system-master.password}
-        sharding:
-          lazy: true
-          type: ${spring.datasource.type}
-          driver-class-name: com.mysql.cj.jdbc.Driver
-          # shardingproxy 服务的ip地址
-          url: jdbc:mysql://127.0.0.1:3307/data-center_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
-          username: root
-          password: root
-#        oracle:
-#          type: ${spring.datasource.type}
-#          driverClassName: oracle.jdbc.OracleDriver
-#          url: ${datasource.system-oracle.url}
-#          username: ${datasource.system-oracle.username}
-#          password: ${datasource.system-oracle.password}
-#          hikari:
-#            connectionTestQuery: SELECT 1 FROM DUAL
-#        postgres:
-#          type: ${spring.datasource.type}
-#          driverClassName: org.postgresql.Driver
-#          url: ${datasource.system-postgres.url}
-#          username: ${datasource.system-postgres.username}
-#          password: ${datasource.system-postgres.password}
-
---- # elasticsearch 功能配置
-# 文档地址: https://www.easy-es.cn/
-# 更改包名需要去 EasyEsConfiguration 修改包扫描(后续版本支持配置文件读取)
-easy-es:
-  # 是否开启EE自动配置
-  enable: false
-  # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开
-  address : localhost:9200
-  # 默认为http
-  schema: http
-  # 注意ES建议使用账号认证 不使用会报警告日志
-  #如果无账号密码则可不配置此行
-  #username:
-  #如果无账号密码则可不配置此行
-  #password:
-  # 心跳策略时间 单位:ms
-  keep-alive-millis: 18000
-  # 连接超时时间 单位:ms
-  connectTimeout: 5000
-  # 通信超时时间 单位:ms
-  socketTimeout: 5000
-  # 连接请求超时时间 单位:ms
-  connectionRequestTimeout: 5000
-  # 最大连接数 单位:个
-  maxConnTotal: 100
-  # 最大连接路由数 单位:个
-  maxConnPerRoute: 100
-  global-config:
-    # 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能
-    print-dsl: true
-    # 异步处理索引是否阻塞主线程 默认阻塞 数据量过大时调整为非阻塞异步进行 项目启动更快
-    asyncProcessIndexBlocking: true
-    db-config:
-      # 是否开启下划线转驼峰 默认为false
-      map-underscore-to-camel-case: true
-      # id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成
-      id-type: customize
-      # 字段更新策略 默认为not_null
-      field-strategy: not_null
-      # 默认开启,查询若指定了size超过1w条时也会自动开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响.
-      enable-track-total-hits: true
-      # 数据刷新策略,默认为不刷新
-      refresh-policy: immediate

+ 15 - 0
ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/IXfTermTotalService.xml → ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml

@@ -22,5 +22,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT * FROM test_demo ${ew.customSqlSegment}
     </select>
 
+    <select id="selectListEncrypt" resultType="org.dromara.demo.domain.TestDemoEncrypt">
+        SELECT * FROM test_demo
+        <where>
+            <if test="demo.testKey != null and demo.testKey != ''">
+                AND test_key = #{demo.testKey}
+            </if>
+            <if test="demo.value != null and demo.value != ''">
+                AND value = #{demo.value}
+            </if>
+            <if test="demo.id != null">
+                AND id = #{demo.id}
+            </if>
+        </where>
+    </select>
+
 
 </mapper>