Compare commits

..

No commits in common. 'b5b15fe54194c55a5cce138a74e49bc2298266ec' and 'd6f2b57e5a616d1e7165e7edea6fc7fe47e42436' have entirely different histories.

  1. 5
      dntd-common/pom.xml
  2. 5
      dntd-model-buildheating/pom.xml
  3. 7
      dntd-model-heatboiler/pom.xml
  4. 7
      dntd-modelI/pom.xml
  5. 7
      dntd-tool/pom.xml
  6. 73
      dntd-tool/src/main/java/com/dky/security/SM4Utils.java
  7. 128
      dntd-tool/src/main/java/com/dky/tool/ModelTool.java
  8. 3
      file.txt
  9. 41
      pom.xml

@ -22,10 +22,7 @@
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
</dependency> <version>5.4.5</version>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>

@ -19,6 +19,11 @@
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.5</version>
</dependency>
<dependency> <dependency>
<groupId>com.dky</groupId> <groupId>com.dky</groupId>
<artifactId>dntd-modelI</artifactId> <artifactId>dntd-modelI</artifactId>

@ -10,7 +10,7 @@
</parent> </parent>
<artifactId>dntd-model-heatboiler</artifactId> <artifactId>dntd-model-heatboiler</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.1-SNAPSHOT</version>
<properties> <properties>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
@ -19,6 +19,11 @@
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.5</version>
</dependency>
<dependency> <dependency>
<groupId>com.dky</groupId> <groupId>com.dky</groupId>
<artifactId>dntd-modelI</artifactId> <artifactId>dntd-modelI</artifactId>

@ -10,7 +10,7 @@
</parent> </parent>
<artifactId>dntd-modelI</artifactId> <artifactId>dntd-modelI</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.1-SNAPSHOT</version>
<properties> <properties>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
@ -18,6 +18,11 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.5</version>
</dependency>
<dependency> <dependency>
<groupId>com.dky</groupId> <groupId>com.dky</groupId>

@ -10,7 +10,7 @@
</parent> </parent>
<artifactId>dntd-tool</artifactId> <artifactId>dntd-tool</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
<properties> <properties>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
@ -18,6 +18,11 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.5</version>
</dependency>
<dependency> <dependency>
<groupId>org.bouncycastle</groupId> <groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId> <artifactId>bcprov-jdk15on</artifactId>

@ -1,13 +1,12 @@
package com.dky.security; package com.dky.security;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher; import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import java.io.*; import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.Security; import java.security.Security;
import java.util.*; import java.util.*;
@ -17,8 +16,7 @@ public class SM4Utils {
Security.addProvider(new BouncyCastleProvider()); Security.addProvider(new BouncyCastleProvider());
} }
public final static String SM4_KEY = "1100fba8ee67ddf1f6f4e37c500dc10eee1bf15827ae3837810e30f402fa0bc6"; private static final String SM4_KEY = "mxhXSDiPYFjYgzRb"; // 16 bytes key
private static final String ALGORITHM = "AES/ECB/PKCS5Padding"; private static final String ALGORITHM = "AES/ECB/PKCS5Padding";
public static String encrypt(Map<String, String> map) throws Exception { public static String encrypt(Map<String, String> map) throws Exception {
@ -30,32 +28,28 @@ public class SM4Utils {
return Base64.getEncoder().encodeToString(encrypted); return Base64.getEncoder().encodeToString(encrypted);
} }
public static Map<String, String> decrypt(String encrypted) throws FileNotFoundException { public static List<Map<String, String>> decrypt(String encrypted) throws Exception {
List<Map<String, String>> ary = new ArrayList<>();
File file = new File("file.txt"); File file = new File("file.txt");
FileReader fileReader = new FileReader(file); FileReader fileReader = new FileReader(file);
try (BufferedReader reader = new BufferedReader(fileReader)) { BufferedReader reader = new BufferedReader(fileReader);
String line; String line;
while ((line = reader.readLine()) != null) { while ((line = reader.readLine()) != null) {
try { Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
Cipher cipher = Cipher.getInstance(ALGORITHM, "BC"); SecretKeySpec secretKey = new SecretKeySpec(line.getBytes(StandardCharsets.UTF_8), "AES");
SecretKeySpec secretKey = new SecretKeySpec(line.getBytes(StandardCharsets.UTF_8), "AES"); cipher.init(Cipher.DECRYPT_MODE, secretKey);
cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decoded = Base64.getDecoder().decode(encrypted);
byte[] decoded = Base64.getDecoder().decode(encrypted); try {
byte[] decrypted = cipher.doFinal(decoded); byte[] decrypted = cipher.doFinal(decoded);
return stringToMap(new String(decrypted, StandardCharsets.UTF_8)); ary.add(stringToMap(new String(decrypted, StandardCharsets.UTF_8)));
} catch (Exception e) { } catch (Exception e) {
System.out.println("私钥:" + line + ",该私钥未认证"); // e.printStackTrace();
e.printStackTrace();
}
} }
} catch ( IOException e){
System.out.println("文件读取错误,请检查文件内容是否为空");
throw new RuntimeException();
} }
return null;
}
return ary;
}
private static String mapToString(Map<String, String> map) { private static String mapToString(Map<String, String> map) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@ -83,15 +77,22 @@ public class SM4Utils {
List<Map<String, String>> decryptList = decrypt(s); List<Map<String, String>> decryptList = decrypt(s);
decryptList.forEach(System.out::println); decryptList.forEach(System.out::println);
/** /*
* SM2私钥解密 File file = new File("file.txt");
* try {
* @param encryptStr SM2加密字符串 FileReader fileReader = new FileReader(file);
* @return BufferedReader reader = new BufferedReader(fileReader);
*/ String line;
public static String sm2DecryptBase64(String encryptStr) { while ((line = reader.readLine()) != null) {
SM2 sm2 = new SM2(SM4_KEY, null); // 处理每一行的数据
return StrUtil.utf8Str(sm2.decrypt(encryptStr, KeyType.PrivateKey)); System.out.println(line);
} }
reader.close();
} catch (IOException e) {
e.printStackTrace();
}*/
}
} }

@ -3,15 +3,19 @@ package com.dky.tool;
import cn.hutool.json.JSONArray; import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import com.dky.modelI.DntdModelI; import com.dky.modelI.DntdModelI;
import com.dky.security.GetCpuInfo;
import com.dky.utils.ConfigReader; import com.dky.utils.ConfigReader;
import com.dky.utils.entity.SysDeviceHeatScene; import com.dky.utils.entity.SysDeviceHeatScene;
import com.dky.utils.enums.Code; import com.dky.utils.enums.Code;
import com.dky.utils.result.ResponseUtil; import com.dky.utils.result.ResponseUtil;
import org.bouncycastle.math.raw.Mod;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class ModelTool { public class ModelTool {
@ -37,90 +41,58 @@ public class ModelTool {
} }
public JSONObject exeModel2Report(JSONObject jsonObject, String key,List<Map> mapList) { public JSONObject exeModel2Report(JSONObject jsonObject, String key) {
JSONObject jsonObjectResult = new JSONObject(); JSONObject jsonObjectResult = new JSONObject();
// 判断CpuId是否包含本机地址 // 判断CpuId是否包含本机地址
Boolean isAuthorization = Boolean.FALSE; Boolean thisCpuIdIn = false;
// 参数合法性检查 // 判断是否过期
if (key == null || key.isEmpty()) { Boolean expired = false;
System.err.println("解密密钥不能为空");
return ResponseUtil.createResponse(Code.KEY_CONTEXT_ERROR.getCode(), Code.KEY_CONTEXT_ERROR.getDesc(), null);
}
//这里会去查询两张表,分别是mysql中的information_schema库的tables和statistics表中的设备数据表元信息,其中有用的只是tables中的create_time字段,其余字段没有任何意义,只是为了防止破解
if (mapList.size() != 2){
System.err.println("未获取到验证信息");
return ResponseUtil.createResponse(Code.KEY_CONTEXT_ERROR.getCode(), Code.KEY_CONTEXT_ERROR.getDesc(), null);
}
try { try {
//获取本地的cpuid.
String localCpuId = GetCpuInfo.getCpuId();
// 根据给定的类名初始化类 加密不需要反实例化new // 根据给定的类名初始化类 加密不需要反实例化new
Class<?> sm4UtilsClass = Class.forName("com.dky.security.SM4Utils"); Class sm4UtilsClass = Class.forName("com.dky.security.SM4Utils");
// 实例化类 // 实例化这个类
Object obj = sm4UtilsClass.getDeclaredConstructor().newInstance(); Object obj = sm4UtilsClass.newInstance();
// 获取方法并调用 // 调用指定方法
Method decryptMethod = sm4UtilsClass.getMethod("sm2DecryptBase64", String.class); List<Map> maps = (List<Map>) sm4UtilsClass.getMethod("decrypt", String.class).invoke(obj, key);
String invoke = (String) decryptMethod.invoke(obj, key); for (Map map : maps){
Map<String, String> map = new HashMap<>(); String cpuIds = (String) map.get("cpuIds");
String[] keyValuePairs = invoke.split("&"); String expireTime = (String) map.get("expireTime");
for (String keyValuePair : keyValuePairs) { // 定义日期时间格式
String[] keyValue = keyValuePair.split("="); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String key1 = keyValue[0]; Date date = formatter.parse(expireTime);
String value = keyValue[1]; if (cpuIds.contains(localCpuId)){
map.put(key1, value); thisCpuIdIn = true;
}
if (new Date().before(date)){
expired = true;
}
} }
//获取table表的JSONObject
Map table = mapList.get(0); if (thisCpuIdIn){
//获取statistics表的JSONObject if (expired){
Map statistics = mapList.get(1); // 判断模型使用权限
if(statistics == null) { // 根据给定的类名初始化类 加密不需要反实例化new
System.err.println("未获取到验证信息"); Class buildHeatingScene = Class.forName("com.dky"+"."+ ConfigReader.getProperty(jsonObject.getStr("type")));
return ResponseUtil.createResponse(Code.KEY_UNAUTHORIZED.getCode(), Code.KEY_UNAUTHORIZED.getDesc(), null); // 实例化这个类
} DntdModelI buildHeatingSceneModel = (DntdModelI)buildHeatingScene.newInstance();
if(map.get("expireTime") == null){ // 调用指定方法
return ResponseUtil.createResponse(Code.KEY_CONTEXT_ERROR.getCode(), Code.KEY_CONTEXT_ERROR.getDesc(), null); jsonObjectResult = buildHeatingSceneModel.createReport(jsonObject,this.specList);
} }else {
if(map.get("companyname") == null){ jsonObjectResult = ResponseUtil.createResponse(Code.KEY_EXPIRATION.getCode(), Code.KEY_EXPIRATION.getDesc(), null);
return ResponseUtil.createResponse(Code.KEY_CONTEXT_ERROR.getCode(), Code.KEY_CONTEXT_ERROR.getDesc(), null);
}
// 定义日期时间格式并转化日期数据
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//创建表日期
Date createTimeDate = null;
try{
createTimeDate = formatter.parse((String) table.get("CREATE_TIME"));
} catch (NullPointerException e){
try{
createTimeDate = formatter.parse((String) statistics.get("create_time"));
} catch (NullPointerException e1){
e1.printStackTrace();
return ResponseUtil.createResponse(Code.KEY_UNAUTHORIZED.getCode(), Code.KEY_UNAUTHORIZED.getDesc(), null);
} }
}else {
jsonObjectResult = ResponseUtil.createResponse(Code.KEY_UNAUTHORIZED.getCode(), Code.KEY_UNAUTHORIZED.getDesc(), null);
} }
//key中验证日期 } catch (ClassNotFoundException | NoSuchMethodException e) {
Date startTimeDate = formatter.parse(map.get("cpuIds")); e.printStackTrace();
//表创建时间早于key中时间,直接放行 } catch (InstantiationException e) {
if (createTimeDate.before(startTimeDate)){ e.printStackTrace();
isAuthorization = Boolean.TRUE; } catch (IllegalAccessException e) {
} e.printStackTrace();
//表创建时间早于key10天内的时间,直接放行
if (createTimeDate.before(new Date(startTimeDate.getTime() + 1000 * 60 * 60 * 24 * 10))){
isAuthorization = Boolean.TRUE;
}
if (isAuthorization) {
// 判断模型使用权限
// 根据给定的类名初始化类 加密不需要反实例化new
Class<?> buildHeatingScene = Class.forName("com.dky" + "." + ConfigReader.getProperty(jsonObject.getStr("type")));
// 实例化这个类
DntdModelI buildHeatingSceneModel = (DntdModelI) buildHeatingScene.newInstance();
// 调用指定方法
jsonObjectResult = buildHeatingSceneModel.createReport(jsonObject, this.specList);
} else {
jsonObjectResult = ResponseUtil.createResponse(Code.KEY_UNAUTHORIZED.getCode(), Code.KEY_UNAUTHORIZED.getDesc(), null);
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
NoSuchMethodException | SecurityException e) {
// 异常处理
System.err.println("反射调用过程中发生异常: " + e.getMessage());
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
jsonObjectResult = ResponseUtil.createResponse(Code.KEY_CONTEXT_ERROR.getCode(), Code.KEY_CONTEXT_ERROR.getDesc(), null); jsonObjectResult = ResponseUtil.createResponse(Code.KEY_CONTEXT_ERROR.getCode(), Code.KEY_CONTEXT_ERROR.getDesc(), null);
e.printStackTrace(); e.printStackTrace();

@ -0,0 +1,3 @@
mxhXSDiPYFjYgzRb
sm4demo123456789
myhXSDiPUFjYgzRa

@ -29,35 +29,30 @@
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
<version>5.8.25</version> <version>5.4.5</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.69</version>
</dependency> </dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<build> <build>
<plugins> <plugins>
<!-- 代码混淆插件 --> <!-- 代码混淆插件 -->
<plugin> <!-- <plugin>-->
<groupId>com.dwp</groupId> <!-- <groupId>com.dwp</groupId>-->
<artifactId>obfuscation</artifactId> <!-- <artifactId>obfuscation</artifactId>-->
<version>1.0.0</version> <!-- <version>1.0.0</version>-->
<executions> <!-- <executions>-->
<execution> <!-- <execution>-->
<phase>compile</phase> <!-- <phase>compile</phase>-->
<goals> <!-- <goals>-->
<goal>obfuscation</goal> <!-- <goal>obfuscation</goal>-->
</goals> <!-- </goals>-->
</execution> <!-- </execution>-->
</executions> <!-- </executions>-->
<configuration> <!-- <configuration>-->
<basePath>${basedir}</basePath> <!-- <basePath>${basedir}</basePath>-->
<classPath>${basedir}/target/classes</classPath> <!-- <classPath>${basedir}/target/classes</classPath>-->
</configuration> <!-- </configuration>-->
</plugin> <!-- </plugin>-->
</plugins> </plugins>
<resources> <resources>
<resource> <resource>

Loading…
Cancel
Save