生成设备码

main
liu 2025-08-19 15:55:21 +08:00
parent ca698284e8
commit 854e4286de
4 changed files with 205 additions and 99 deletions

View File

@ -62,7 +62,7 @@ public class AppRun {
springApplication.addListeners(new ApplicationPidFileWriter()); springApplication.addListeners(new ApplicationPidFileWriter());
springApplication.run(args); springApplication.run(args);
log.error(JSONUtil.toJsonStr(LicenseValidate.getDeviceInfo()));
} }

View File

@ -2,122 +2,176 @@ package com.youchain.modules.license;
import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileReader; import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.io.file.FileWriter; import cn.hutool.core.io.file.FileWriter;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.youchain.config.FileProperties; import com.youchain.config.FileProperties;
import com.youchain.config.RsaProperties; import com.youchain.config.RsaProperties;
import com.youchain.exception.BadRequestException; import com.youchain.exception.BadRequestException;
import com.youchain.modules.license.domain.LicenseCheck; import com.youchain.modules.license.domain.LicenseCheck;
import com.youchain.utils.RedisUtils;
import com.youchain.utils.RsaUtils; import com.youchain.utils.RsaUtils;
import com.youchain.utils.SpringContextHolder; import com.youchain.utils.SpringContextHolder;
import com.youchain.utils.StringUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.Arrays; import org.apache.commons.codec.binary.Base64;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Date; import java.util.Date;
/**
* @author 92525
*/
@Slf4j
public class LicenseValidate { public class LicenseValidate {
public static void validate() throws Exception { public static LicenseCheck getKeyPrice() throws Exception{
//读取本地文件 //读取本地文件
FileProperties properties = SpringContextHolder.getBean(FileProperties.class); FileProperties properties= SpringContextHolder.getBean(FileProperties.class);
String result="";
String result = ""; try{
try { FileReader fileReader = new FileReader(properties.getPath().getPath()+"key/"+"license.key");
FileReader fileReader = new FileReader(properties.getPath().getPath() + "key/" + "license.key");
result = fileReader.readString(); result = fileReader.readString();
} catch (Exception e) { }catch (Exception e){
throw new BadRequestException("License不存在,请上传License"); throw new BadRequestException("License不存在,请上传License");
} }
String rsaResult= RsaUtils.decryptByPublicKey(RsaProperties.licenseKey,result);
String rsaResult = RsaUtils.decryptByPublicKey(RsaProperties.licenseKey, result); LicenseCheck keyPrice = JSONUtil.toBean(rsaResult, LicenseCheck.class);
return keyPrice;
LicenseCheck key_price = JSONUtil.toBean(rsaResult, LicenseCheck.class);
LicenseCheck system_price = getDeviceInfo();
if (key_price.getMainBoardSerial().equals(system_price.getMainBoardSerial())) {
} else {
throw new BadRequestException("主板匹配失败");
}
if (key_price.getCpuSerial().equals(system_price.getCpuSerial())) {
} else {
throw new BadRequestException("CPU匹配失败");
}
Date end_date = DateUtil.parse(key_price.getEndTime());
Date now_date = DateUtil.date();
if (end_date.before(now_date)) {
throw new BadRequestException("过期的License,请重新生成");
} else {
}
} }
public static void saveCode(String license_code) throws Exception{ public static LicenseCheck getSystemPrice(){
//读取本地文件 LicenseCheck licenseCheck=null;
FileProperties properties= SpringContextHolder.getBean(FileProperties.class);
String devicePath =properties.getPath().getPath()+"key/"+"device.key";
String deviceInfoJson =readDeviceFile();
if(StringUtils.isNotBlank(deviceInfoJson)){
try{
licenseCheck =JSONUtil.toBean(deviceInfoJson,LicenseCheck.class);
BasicFileAttributes attributes = Files.readAttributes(Paths.get(devicePath), BasicFileAttributes.class);
String creationTime = attributes.creationTime().toString();
String lastModifiedTime = attributes.lastModifiedTime().toString();
Date licenseCheckDate = DateUtil.parse(licenseCheck.getCreateTime(), "yyyy-MM-dd");
Date fCreationTime = DateUtil.parse(creationTime, "yyyy-MM-dd");
Date fLastModifiedTime = DateUtil.parse(lastModifiedTime, "yyyy-MM-dd");
String rsaResult=""; long betweenDay = DateUtil.between(licenseCheckDate, fCreationTime, DateUnit.DAY);
try{ long betweenDay2 = DateUtil.between(licenseCheckDate, fLastModifiedTime, DateUnit.DAY);
rsaResult= RsaUtils.decryptByPublicKey(RsaProperties.licenseKey,license_code); if(betweenDay==0&&betweenDay2==0){
}catch (Exception e){ //文件时间校验通过,不需要重新生成
throw new BadRequestException("License无效请重新生成"); return licenseCheck;
}else{
}
}catch (Exception e){
}
}
createDeviceFileOrRead();
return licenseCheck;
}
public static void validate() throws Exception{
LicenseCheck keyPrice =getKeyPrice();
LicenseCheck systemPrice = getSystemPrice();
if(systemPrice==null){
throw new BadRequestException("设备码异常");
} }
if(keyPrice.getMainBoardSerial().equals(systemPrice.getMainBoardSerial())){
LicenseCheck key_price = JSONUtil.toBean(rsaResult, LicenseCheck.class);
LicenseCheck system_price = getDeviceInfo();
if(key_price.getMainBoardSerial().equals(system_price.getMainBoardSerial())){
}else{ }else{
log.error("主板匹配失败");
throw new BadRequestException("主板匹配失败"); throw new BadRequestException("主板匹配失败");
} }
if(key_price.getCpuSerial().equals(system_price.getCpuSerial())){ if(keyPrice.getCpuSerial().equals(systemPrice.getCpuSerial())){
}else{ }else{
log.error("CPU匹配失败");
throw new BadRequestException("CPU匹配失败"); throw new BadRequestException("CPU匹配失败");
} }
try{ try{
Date end_date = DateUtil.parse(key_price.getEndTime()); Date endDate = DateUtil.parse(keyPrice.getEndTime());
Date now_date = DateUtil.date(); Date nowDate = DateUtil.date();
if(end_date.before(now_date)){ if(endDate.before(nowDate)){
throw new BadRequestException("过期的License,请重新生成"); throw new BadRequestException("过期的License,请重新生成");
}else{ }else{
} }
}catch (Exception e){ }catch (Exception e){
throw new BadRequestException("License有效期错误,请重新生成"); throw new BadRequestException("无效的License,请重新生成");
}
}
public static void saveCode(String licenseCode) throws Exception{
//读取本地文件
log.error(licenseCode);
String rsaResult="";
try{
rsaResult= RsaUtils.decryptByPublicKey(RsaProperties.licenseKey,licenseCode);
}catch (Exception e){
throw new BadRequestException("License无效请重新生成");
}
//log.error(rsaResult);
LicenseCheck keyPrice = JSONUtil.toBean(rsaResult, LicenseCheck.class);
LicenseCheck systemPrice =getSystemPrice();
if(keyPrice.getMainBoardSerial().equals(systemPrice.getMainBoardSerial())){
log.error("主板匹配成功");
}else{
log.error("主板匹配失败");
throw new BadRequestException("主板匹配失败");
}
if(keyPrice.getCpuSerial().equals(systemPrice.getCpuSerial())){
log.error("CPU匹配成功");
}else{
log.error("CPU匹配失败");
throw new BadRequestException("CPU匹配失败");
}
try{
Date endDate = DateUtil.parse(keyPrice.getEndTime());
Date nowDate = DateUtil.date();
if(endDate.before(nowDate)){
throw new BadRequestException("过期的License,请重新生成");
}else{
log.error("有效期验证通过");
}
}catch (Exception e){
throw new BadRequestException("无效的License,请重新生成");
} }
FileProperties properties= SpringContextHolder.getBean(FileProperties.class); FileProperties properties= SpringContextHolder.getBean(FileProperties.class);
FileWriter writer = new FileWriter(properties.getPath().getPath()+"key/"+"license.key"); FileWriter writer = new FileWriter(properties.getPath().getPath()+"key/"+"license.key");
writer.write(license_code); writer.write(licenseCode);
} }
public static LicenseCheck getDeviceInfo(){
private static LicenseCheck getDeviceInfo(){
String osName = System.getProperty("os.name"); String osName = System.getProperty("os.name");
osName = osName.toLowerCase(); osName = osName.toLowerCase();
AGxServerInfos abstractServerInfos; AGxServerInfos abstractServerInfos;
@ -130,6 +184,80 @@ public class LicenseValidate {
abstractServerInfos = new LinuxServerInfos(); abstractServerInfos = new LinuxServerInfos();
} }
return abstractServerInfos.getServerInfos(); return abstractServerInfos.getServerInfos();
}
public static String readDeviceFile(){
FileProperties properties= SpringContextHolder.getBean(FileProperties.class);
String path=properties.getPath().getPath()+"key/"+"device.key";
try{
FileReader fileReader=new FileReader(path);
String jiaMiContent =fileReader.readString();
String jieMi1= new String(Base64.decodeBase64(jiaMiContent));
String jieMi2= new String(Base64.decodeBase64(jieMi1));
return jieMi2;
}catch (Exception e){
log.error("设备码文件不存在");
return "";
}
}
public static void createDeviceFileOrRead(){
FileProperties properties= SpringContextHolder.getBean(FileProperties.class);
String devicePath =properties.getPath().getPath()+"key/"+"device.key";
System.out.println("获取配置文件路径:"+devicePath);
String deviceInfoJson =readDeviceFile();
if(StringUtils.isNotBlank(deviceInfoJson)){
try{
LicenseCheck licenseCheck =JSONUtil.toBean(deviceInfoJson,LicenseCheck.class);
BasicFileAttributes attributes = Files.readAttributes(Paths.get(devicePath), BasicFileAttributes.class);
String creationTime = attributes.creationTime().toString();
String lastModifiedTime = attributes.lastModifiedTime().toString();
System.out.println(creationTime+"-------------"+lastModifiedTime);
Date licenseCheckDate = DateUtil.parse(licenseCheck.getCreateTime(), "yyyy-MM-dd");
Date fCreationTime = DateUtil.parse(creationTime, "yyyy-MM-dd");
Date fLastModifiedTime = DateUtil.parse(lastModifiedTime, "yyyy-MM-dd");
long betweenDay = DateUtil.between(licenseCheckDate, fCreationTime, DateUnit.DAY);
long betweenDay2 = DateUtil.between(licenseCheckDate, fLastModifiedTime, DateUnit.DAY);
if(betweenDay==0&&betweenDay2==0){
//文件时间校验通过,不需要重新生成
System.out.println("------------------------文件时间校验通过,不需要重新生成-----------------------");
return ;
}else{
System.out.println("------------------------文件时间校验失败,重新生成-----------------------");
}
}catch (Exception e){
System.out.println("检验异常:"+e.toString());
}
}
//文件不存在,或者文件校验失败,删除文件,重新生成
FileUtil.del(new File(devicePath));
System.out.println("文件不存在,或者文件校验失败,删除文件,重新生成");
LicenseCheck licenseCheck=getDeviceInfo();
if(!StringUtils.isNotBlank(licenseCheck.getCpuSerial())){
String cpuSerial=""+ (new java.util.Random().nextInt(89999999)+10000000);
licenseCheck.setCpuSerial(cpuSerial);
}
if(!StringUtils.isNotBlank(licenseCheck.getMainBoardSerial())){
String macSerial=""+ (new java.util.Random().nextInt(89999999)+10000000);
licenseCheck.setMainBoardSerial(macSerial);
}
licenseCheck.setCreateTime(DateUtil.today());
String rest= JSONUtil.toJsonStr(licenseCheck).trim();
String jiaMi1 = Base64.encodeBase64String(rest.getBytes());
String jiaMi2= Base64.encodeBase64String(jiaMi1.getBytes());
FileWriter writer = new FileWriter(properties.getPath().getPath()+"key/"+"device.key");
writer.write(jiaMi2);
} }
} }

View File

@ -1,12 +1,16 @@
package com.youchain.modules.license.domain; package com.youchain.modules.license.domain;
import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
/**
* @author 92525
*/
@Data
public class LicenseCheck implements Serializable { public class LicenseCheck implements Serializable {
/** /**
* CPU * CPU
*/ */
@ -19,35 +23,9 @@ public class LicenseCheck implements Serializable {
* *
*/ */
private String endTime; private String endTime;
/**
public String getEndTime() { *
return endTime; */
} private String createTime;
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public LicenseCheck(){
}
public String getCpuSerial() {
return cpuSerial;
}
public void setCpuSerial(String cpuSerial) {
this.cpuSerial = cpuSerial;
}
public String getMainBoardSerial() {
return mainBoardSerial;
}
public void setMainBoardSerial(String mainBoardSerial) {
this.mainBoardSerial = mainBoardSerial;
}
} }

View File

@ -229,8 +229,8 @@ public class AuthorizationController {
@ApiOperation("获取服务器信息") @ApiOperation("获取服务器信息")
@AnonymousGetMapping(value = "/deviceinfo") @AnonymousGetMapping(value = "/deviceinfo")
public ResponseEntity<Object> getDeviceInfo() { public ResponseEntity<Object> getDeviceInfo() {
LicenseCheck licenseCheck= LicenseValidate.getDeviceInfo(); LicenseCheck licenseCheck= LicenseValidate.getSystemPrice();
String rest=Base64.encodeBase64String(JSONUtil.toJsonStr(licenseCheck).trim().getBytes()); String rest= Base64.encodeBase64String(JSONUtil.toJsonStr(licenseCheck).trim().getBytes());
return ResponseEntity.ok(rest); return ResponseEntity.ok(rest);
} }