数据完整性校验

This commit is contained in:
yuejiajun 2025-10-16 11:14:44 +08:00
parent 60f6020c2c
commit 89a2d2bfd1

View File

@ -1,5 +1,6 @@
package com.example.demo.common.domain;
import com.alibaba.fastjson.JSON;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Getter;
@ -10,6 +11,8 @@ import lombok.experimental.SuperBuilder;
import java.io.Serial;
import java.io.Serializable;
import java.security.MessageDigest;
import java.util.Objects;
/**
* 导入导出加密传输对象
@ -43,22 +46,34 @@ public class BaseXPortData implements Serializable {
private String ts;
/**
* 签名
* 签名 sign
*/
@Schema(description = "签名")
private String sign;
private String s;
/**
* 完整性
* 完整性 gritty
*/
@Schema(description = "完整性")
private String gritty;
private String g;
/**
* 版本
* 版本 version
*/
@Schema(description = "版本")
private String version;
private String v;
/**
* 类名 clazz
*/
@Schema(description = "类名")
private String c;
/**
* 类名 service
*/
@Schema(description = "服务名")
private String e;
/**
* 数据
@ -66,4 +81,64 @@ public class BaseXPortData implements Serializable {
@Schema(description = "数据")
private String data;
/**
* 获取校验和
* @return 为空则进行计算
*/
public String getG() {
return g == null || g.trim().isEmpty() ? (generateChecksum(c, v, e, data)) : (g);
}
/**
* 生成数据的校验和
*/
public static String generateChecksum(String c, String v, String e, String data) {
try {
String combined = c + "|" + v + "|" + e + "|" + data;
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(combined.getBytes());
@SuppressWarnings("all")
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
} catch (Exception ex) {
throw new RuntimeException("生成校验和失败", ex);
}
}
/**
* 验证数据完整性
*/
public static boolean verifyIntegrity(String c, String v, String e, String data, String expectedChecksum) {
String actualChecksum = generateChecksum(c, v, e, data);
return Objects.equals(actualChecksum, expectedChecksum);
}
/**
* 验证数据完整性
*/
public boolean verifyIntegrity() {
return verifyIntegrity(c, v, e, data, g);
}
public static void main(String[] args) {
BaseXPortData baseXPortData = new BaseXPortData();
baseXPortData.id = "1";
baseXPortData.ts = "1";
// baseXPortData.s = "1";
baseXPortData.data = "123";
System.out.println("check: " + baseXPortData.getG());
String json = JSON.toJSONString(baseXPortData);
System.out.println("json: " + json);
BaseXPortData baseXPortData1 = JSON.parseObject(json, BaseXPortData.class);
baseXPortData1.data = "1234";
System.out.println("verifyIntegrity: " + baseXPortData1.verifyIntegrity());
}
}