package com.ruoyi.authorize.common;
|
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.codec.binary.Hex;
|
import org.apache.commons.compress.utils.IOUtils;
|
import java.io.*;
|
import java.net.InetAddress;
|
import java.net.NetworkInterface;
|
import java.util.Base64;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.GregorianCalendar;
|
import java.util.Scanner;
|
import javax.crypto.Cipher;
|
import javax.crypto.KeyGenerator;
|
import javax.crypto.SecretKey;
|
import javax.crypto.SecretKeyFactory;
|
import javax.crypto.spec.DESedeKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
import javax.xml.bind.DatatypeConverter;
|
|
@Slf4j(topic="authorize")
|
public class AuthorizeUtil {
|
|
public static String MachineCode="";
|
|
private static String confusionString = "TczYTMY2MzII32MVjZjgjMzYWmQwM5z";
|
private static String confusionString2 = "0ZDMwM2UxYTFmZmRZWZkMkODUxNGYzM";
|
private static String confusionString3 = "MxYzY2ZDUYzN5MAOWViNWQ3YzOTRke9";
|
private static String confusionString4 = "f15a5M0MjNmExNlNkNDQzWI3MTE1NTN";
|
|
private static String getKeyStr(String keyStr) {
|
return Md5Utils.hash(keyStr);
|
}
|
|
public static void main(String[] args) {
|
|
AuthorizeUtil ss = new AuthorizeUtil();
|
log.debug("sysStr " + ss.parsLicense());
|
log.debug("MachineCode " + ss.getMachineCode());
|
log.debug("CPUCode " + ss.getCPUCode());
|
//String codeString=ss.parsLicense("b1db709f19d9769e536e2e29888e38b2");
|
//System.out.println(codeString);
|
//ss.makeTempLicense();
|
//System.out.println("get "+ss.parsLicense());
|
//ss.writeFile("22");
|
/*
|
String str = "{\"systemAuthorizeDate\":\"20190404240000\",\"meteorologicalDeviceType\":\"1,2\",\"meteorologicalDeviceNum\":\"999\",\"screenDeviceType\":\"1,2,3\",\"screenDeviceNum\":\"999\",\"captureDeviceType\":\"1,2,3,4\",\"captureDeviceNum\":\"999\"}";
|
str = "{\"systemAuthorizeDate\":\"20180721015732\",\"meteorologicalDeviceType\":\"1,2\",\"meteorologicalDeviceNum\":\"10\",\"screenDeviceType\":\"1,2,3\",\"screenDeviceNum\":\"10\",\"captureDeviceType\":\"1,2,3,4\",\"captureDeviceNum\":\"10\"}";
|
//System.out.println(ss.encode(key).replace("9", "QQQ999QQQ999QQQ"));
|
System.out.println(str);*/
|
String key = ss.getMachineCode();
|
String stringcodeString = "MGNiYTEwMDNhZTBmNTI2MmUzNGI1ZWNjYmFmZGY3ZDY3ZDU4MDNkMGQ2NTFkYmE4Mjc0NTZjNTQxMzMwZWNmYTkxNDJkYWNjODNiMGYyOTU3MDhlY2QzMDJhMjFjM2VjMmU0M2UyYmFhNzIzNDc5YjMzYjU0YmQzOTVmM2ZmZjE4MjZjYTZlMGQ3ZGM4MjNkY2ZiMWQ0MDkyMDk4ZTYxOTA1ZTM5ZmJkZWI2MTQwNTllNDY1YWQwYTg1OThkNWJkMDljMjRiY2Q2ZTA5NTQzYjYzNWNhNWJhZDZjYTAyMDFmMTYwNzVkNzI2MGEyMThiZDc2MTc0YjRkYjllNjdkZDRjY2ExMTgwYWFhZGU5YzlmY2Y0ZmI0N2Q5N2Q4NjNiNDYxMDAwMzQwNmE3OWM1ODc5YzVjOGYwYmIxMDQ1YjM5NWJkYTk5MjJkOWE1NTRlMDJiYWNlOTE2NmIxYmNiYTZjMTZjZjVhNzMwY2M0NzU1NDhlMGUwOTQ5NzQ4ZWJiMDU4ODcxZmQyYjk4ZWMyNWU2N2RlOWY0ZGFhZGU3MmVmZmJiMGQxNzEzNGZjODZkZmFlYjkxOTU2OTliNmMwMzJkNmU3YmZmMzIzODRmM2UyYzViZTY4NWY5NDY1YjlhODIyZjFiMGQ1NzhlODJjYmNkYzA1YWNhYTg2ODZlMzY2OGQ1ZWRlNmM5YzRiN2RhYTFjZDY0NWQ5ZGMxYmU0YTM1N2U2NDA1NDQxYmVjMWEwM2M2NTQzMTM1YjJjYzY2YjJiMmZkZjNlZWYzZTY5YTQ3YWVlNjhiZTNjMTliMmEyZGZhZWY0NDRmYWEwZDc1MDMxODEyNGE1ZjFjMDZmZGY3MTQzZGYxNDdmYjRmMDdkZTBiYThjYmJlNmFhM2Y1MTk2NTE4MjgwNjYyYzAxMWYyOTNkOWYyYzdlYzQ3Mzc1YTVjZWFiZjdjZGJhYjAxZGRkZWQ5OWUwYTJkNzE1NDBiMjU0MDlmMTQzMThkNDMzNGQyZjNhMjllNDRmYzdlZjA3ZjhhYmE2ZTJiNDZlNjcxNzJhMDJhMjJjZDE3YTZkNTE0MzI2MTkxZjkxMGUyZmE4MGE5ZTFlNjQxZDk3ZDcyZDliYTNjMDI3YjZlYzk3MDIwMDY1YTJhYjEyNTg0";
|
System.out.println("ok " + ss.parsLicense(key, stringcodeString));
|
|
//System.out.println(ss.parsLicense("OWUzYTIxYWI4MWQxZGJlMmYxNDEyY2Y2YWU4NWQzZGFmZjZlZWUwNTMzYmY2ZWI4NWM5ZDFkZTIxMDAwODA5NDJhZGU5NDQ4NmI0MjY3ZmRhMWI0ZjYwZWIxYzU4ZjgzYjNhOTMyZjJiOTZiZjk4ZjY2Y2M0MDg0YjAyMjYwYzhlZjc2YjYwZTJiODQ4MjJmY2Y2ZWRhNTAxM2Q4Zjk0YmZkMGViYjdkYzBkMThjMjRhNDRmZWI3ZTQ2YjM4ZDQ2MjQ1YmQzOTYyYmJhYmRjYzg2Njc5NWQ4MTEyZTEyNjFjMmY3ZjQ1NDY5Y2VmOTliM2I5YzdkMmQxYjYzNWJlMzRjMzZhY2VlYTE0MjdlMjA2NWU3YWY5NGZmZjFjZGM1ODVkNzZlNDVlMmZlNjBlN2Q4ZDMwNThiMDU2MzYyMTE1OTMxYzg2Y2E1MmVjN2Y0YzhiYTBiZGNlYzQ3MjMzYWI4MWEzYzZhZDhkYjQzYTk1YTFiMGRkODJlOGYzNjQzNDE0MzNkYzNhNjA1ZjExN2Y3YTZhODcyNTA3ZTRkYjRjY2FlM2IwMDU4MTg4Y2FhMzA5YjdiN2QzOGQ2MGU3MTU5MzFjODZjYTUyZWM3ZjRjOGJhMGJkY2VjNDcyMzNhNTM3NDZlN2ZlOGFiZWM5OWY2YzhlMTg3NTc0OWEzYmM="));
|
//System.out.println(ss.parsLicense());
|
//System.out.println(ss.parsLicense("ZjRmYjNhYzdiY2Q1NGFjZjc0NWNiNzg1MGMzYTg2YjRzMXkybjNqNG81bjZlN3M4ZWRiN2NzMXkybjNqNG81bjZlN3M4ZmU2YXMxeTJuM2o0bzVuNmU3czg1MDI0ZDI1NDM0ODJjOGQ3N2E3NDRjM2NjYTg3ZHMxeTJuM2o0bzVuNmU3czhmYnMxeTJuM2o0bzVuNmU3czhlYmNkZTQ1czF5Mm4zajRvNW42ZTdzOGU1YjNzMXkybjNqNG81bjZlN3M4YTRkYjcyMTc1ZmZlNHMxeTJuM2o0bzVuNmU3czhzMXkybjNqNG81bjZlN3M4OGJiYWNjZDM3Y2NlZDQwMTBzMXkybjNqNG81bjZlN3M4MzJzMXkybjNqNG81bjZlN3M4ZDBhZjM3NmQ1YnMxeTJuM2o0bzVuNmU3czg1YTMwNmI4ODdkNWRjYmFjZHMxeTJuM2o0bzVuNmU3czg2YzEwZThjMTMxNjE0YTU2MzJlNjdzMXkybjNqNG81bjZlN3M4OGI3YWMwNThhMmNzMXkybjNqNG81bjZlN3M4YWRkNzAyNzU1NzBhYjVlN2M2YmVlMXMxeTJuM2o0bzVuNmU3czhiZWNiYzg3NHMxeTJuM2o0bzVuNmU3czg2ZTBmMTM1NTRhOGMxZjRlYjA0ZmJkZmM1NzU0NDMzMjBkNjRlMjQxN3MxeTJuM2o0bzVuNmU3czgwM2E0YjBlYTAwM2Y1NDNlMjhzMXkybjNqNG81bjZlN3M4YXMxeTJuM2o0bzVuNmU3czhiMWY2MTM0YWFiNDBzMXkybjNqNG81bjZlN3M4NTFiYmYxNXMxeTJuM2o0bzVuNmU3czg4NWZhYThhN3MxeTJuM2o0bzVuNmU3czgyMzIyNjQxNTc1YXMxeTJuM2o0bzVuNmU3czgzMTJkZThmM2FmNjQ4MjQwYzYxMTdhYmVzMXkybjNqNG81bjZlN3M4MjFlM3MxeTJuM2o0bzVuNmU3czhhMWVlMTQxczF5Mm4zajRvNW42ZTdzODZlZGJlNjA3YWE2OGE0MmFkNDVmMjE3NzY4NDhlMWM1ZDVkZTNjYzIxNmEyNmUwMzFkODY4czF5Mm4zajRvNW42ZTdzODZmczF5Mm4zajRvNW42ZTdzODA4NTI0YmUzczF5Mm4zajRvNW42ZTdzOGVjM2Y0NmI3czF5Mm4zajRvNW42ZTdzODYyM2ZkYjVhMTY1ZTc0MzJmczF5Mm4zajRvNW42ZTdzODFmZWY3ODc2ZTE4NjQ3ZjY4YjFzMXkybjNqNG81bjZlN3M4NmRjMTBiczF5Mm4zajRvNW42ZTdzOGU2MDE3ZDQ1MzFmZWUzczF5Mm4zajRvNW42ZTdzOGMzczF5Mm4zajRvNW42ZTdzOGNzMXkybjNqNG81bjZlN3M4YjdmODMyMjRlczF5Mm4zajRvNW42ZTdzOHMxeTJuM2o0bzVuNmU3czg2YjBmNTdjYjVkNmIzNzU3NTBkMGI3MjdmNDM2YnMxeTJuM2o0bzVuNmU3czg4ZGRjM2FhMmM2ODFlNjcwMGQ0MmExNDdmNTdhZDEyMGU4ZDFmN2FlMDFmNmE1ZmUwczF5Mm4zajRvNW42ZTdzODgzY2IwNGZiYzg4NGQzZTZkZGYyMTRmZThlZTIzZDA0ZmU4ZTNlYjBiZDBkMzhzMXkybjNqNG81bjZlN3M4NmZzMXkybjNqNG81bjZlN3M4MDg1MjRiZTNzMXkybjNqNG81bjZlN3M4ZWMzZjQ2YjdzMXkybjNqNG81bjZlN3M4NjIzZmRiNWExMGM1YTQ2YWUwNjNzMXkybjNqNG81bjZlN3M4MGNzMXkybjNqNG81bjZlN3M4Y2QyYWU4MjU4MWYwZWQ1MTc="));
|
|
}
|
|
//获取到授权信息生成-加密信息返回
|
public static String getLicense(String key, String str) {
|
String aString = str.replaceAll("Authorize", confusionString);
|
String bString = encodeAES(getKeyStr(key), aString);
|
String cString = encode64(bString).replaceAll("==", confusionString3).replaceAll("=", confusionString4).replaceAll("4M", confusionString2);
|
return cString;
|
}
|
|
//获取到加密信息和机器码-解密信息返回
|
public static String parsLicense(String key, String str) {
|
try {
|
str = str.replaceAll(confusionString3, "==").replaceAll(confusionString4, "=").replaceAll(confusionString2, "4M");
|
String pString = decode64(str);
|
return decodeAES(getKeyStr(key), pString).replaceAll(confusionString, "Authorize");
|
} catch (Exception ex) {
|
|
}
|
return null;
|
}
|
|
public static String getMachineCode() {
|
StringBuffer sb = new StringBuffer();
|
try {
|
InetAddress ia = InetAddress.getLocalHost();
|
log.debug("IP:"+ia.getHostAddress());
|
NetworkInterface byInetAddress = NetworkInterface.getByInetAddress(ia);
|
log.debug("网卡:"+byInetAddress.getName());
|
byte[] mac = byInetAddress.getHardwareAddress();
|
for (int i = 0; i < mac.length; i++) {
|
if (i != 0) {
|
sb.append("-");
|
}
|
int temp = mac[i] & 0xff;//字节转换为整数
|
String str = Integer.toHexString(temp);
|
if (str.length() == 1) {
|
sb.append("0" + str);
|
} else {
|
sb.append(str);
|
}
|
}
|
log.debug("mac:"+sb.toString().toUpperCase());
|
} catch (Exception e) {
|
log.error("获取机器码异常:"+e.getMessage());
|
}
|
String code = Md5Utils.hash(sb.toString().toUpperCase());
|
log.debug("机器码:"+code);
|
return code;
|
}
|
|
public static String getCPUCode() {
|
String serial = null;
|
try {
|
Process process = Runtime.getRuntime().exec(new String[]{"wmic", "cpu", "get", "ProcessorId"});
|
process.getOutputStream().close();
|
Scanner sc = new Scanner(process.getInputStream());
|
String property = sc.next();
|
serial = sc.next();
|
serial = Md5Utils.hash(serial);
|
//System.out.println(property + ": " + serial);
|
} catch (IOException e) {
|
serial = null;
|
}
|
if (serial == null) {
|
serial = getMachineCode();
|
}
|
return serial;
|
}
|
|
//制作临时授权
|
public static String makeTempLicense(String FilePath) {
|
String tempLicenseDate = "";
|
String str = readToString(FilePath);
|
if (str.equals("")) {//没有授权文件
|
Date date = new Date();//取时间
|
Calendar calendar = new GregorianCalendar();
|
calendar.setTime(date);
|
calendar.add(Calendar.DATE, 1);//把日期往后增加一天.正数往后推,负数往前推
|
date = calendar.getTime(); //这个时间就是日期往后推一天的结果
|
tempLicenseDate = (new java.text.SimpleDateFormat("yyyyMMddhhmmss")).format(date);
|
String machineCode = getMachineCode();
|
String tempLicense = "{\"machineCode\":\"" + machineCode + "\",\"systemAuthorizeDate\":\"" + tempLicenseDate + "\"}";
|
writeFile(FilePath, getLicense(getMachineCode(), tempLicense));
|
}
|
|
return tempLicenseDate;
|
}
|
|
public static String parsLicense(String machineCode) {
|
String str = readToString("D:\\synjones.env\\license.cpy");
|
String returnStr = "";
|
//System.out.println("readfile "+str);
|
if (str.equals("")) {//没有授权文件
|
returnStr = "null";
|
} else {
|
try {
|
returnStr = parsLicense(machineCode, str);
|
} catch (Exception e) {
|
returnStr = "error";
|
}
|
}
|
|
return returnStr;
|
}
|
|
public static String parsLicense() {
|
String authorizeCode = parsLicense(getMachineCode());
|
if (authorizeCode.equals("error")) {
|
authorizeCode = parsLicense(getCPUCode());
|
}
|
return authorizeCode;
|
}
|
|
//base64编码
|
public static String encode64(String src) {
|
byte[] encodeBytes = Base64.getEncoder().encode(src.getBytes());
|
return new String(encodeBytes);
|
}
|
|
//base64解码
|
public static String decode64(String src) {
|
byte[] decodeBytes = Base64.getDecoder().decode(src.getBytes());
|
return new String(decodeBytes);
|
}
|
|
//AES加密
|
public static String encodeAES(String key, String src) {
|
try {
|
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
|
keyGenerator.init(128);// size
|
SecretKey secretKey = keyGenerator.generateKey();
|
// byte[] keyBytes = HexBin.decode(key);
|
byte[] keyBytes = DatatypeConverter.parseHexBinary(key);
|
|
SecretKey generateKey = new SecretKeySpec(keyBytes, "AES");
|
|
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
|
cipher.init(Cipher.ENCRYPT_MODE, generateKey);
|
byte[] resultBytes = cipher.doFinal(src.getBytes());
|
|
return Hex.encodeHexString(resultBytes);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
return null;
|
}
|
|
public static void writeFile(String FilePath, String content) {
|
String FileName = FilePath.substring(FilePath.lastIndexOf("\\") + 1);
|
String FileDir = FilePath.substring(0, FilePath.lastIndexOf("\\") + 1);
|
FileOutputStream fileWriter;
|
OutputStreamWriter writer = null;
|
try {
|
File outDir = new File(FileDir);
|
if (!outDir.exists() && !outDir.isDirectory()) {
|
outDir.mkdir();
|
}
|
|
String file = FilePath;
|
String charSet = "UTF-8";
|
//写字符转换成字节流
|
fileWriter = new FileOutputStream(file);
|
writer = new OutputStreamWriter(fileWriter, charSet);
|
writer.write(content);
|
} catch (IOException e1) {
|
// TODO Auto-generated catch block
|
e1.printStackTrace();
|
} finally {
|
try {
|
writer.close();
|
} catch (IOException e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
}
|
}
|
|
|
}
|
|
public static String readToString(String fileName) {
|
String encoding = "UTF-8";
|
File file = new File(fileName);
|
Long filelength = file.length();
|
byte[] filecontent = new byte[filelength.intValue()];
|
try {
|
FileInputStream in = new FileInputStream(file);
|
in.read(filecontent);
|
in.close();
|
} catch (FileNotFoundException e) {
|
return "";
|
} catch (IOException e) {
|
return "";
|
}
|
try {
|
return new String(filecontent, encoding);
|
} catch (UnsupportedEncodingException e) {
|
System.err.println("The OS does not support " + encoding);
|
e.printStackTrace();
|
return "";
|
}
|
}
|
//读取文件中的字符串
|
public static String readFile(File file) {
|
BufferedReader reader = null;
|
try {
|
//用流读取文件
|
reader = new BufferedReader(new FileReader(file));
|
String line;
|
StringBuffer content = new StringBuffer();
|
// 读取想定文件
|
while ((line = reader.readLine()) != null) {
|
content.append(line);
|
}
|
return content.toString();
|
} catch (IOException e) {
|
return null;
|
} finally {
|
if (reader != null) {
|
IOUtils.closeQuietly(reader);
|
}
|
}
|
}
|
//AES解密
|
public static String decodeAES(String key, String src) {
|
try {
|
// byte[] keyBytes = HexBin.decode(key);
|
byte[] keyBytes = DatatypeConverter.parseHexBinary(key);
|
SecretKey generateKey = new SecretKeySpec(keyBytes, "AES");
|
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
|
cipher.init(Cipher.DECRYPT_MODE, generateKey);
|
byte[] result = Hex.decodeHex(src.toCharArray());
|
return new String(cipher.doFinal(result));
|
} catch (Exception e) {
|
//e.printStackTrace();
|
}
|
return null;
|
}
|
|
public static String encode(String key, String src) {
|
try {
|
KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
|
keyGenerator.init(168);// size
|
SecretKey secretKey = keyGenerator.generateKey();
|
// byte[] keyBytes = HexBin.decode(key);
|
byte[] keyBytes = DatatypeConverter.parseHexBinary(key);
|
|
DESedeKeySpec desKeySpec = new DESedeKeySpec(keyBytes);
|
SecretKeyFactory secretKeyFactory = SecretKeyFactory
|
.getInstance("DESede");
|
SecretKey generateKey = secretKeyFactory.generateSecret(desKeySpec);
|
|
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
|
cipher.init(Cipher.ENCRYPT_MODE, generateKey);
|
byte[] resultBytes = cipher.doFinal(src.getBytes());
|
|
return Hex.encodeHexString(resultBytes);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
return null;
|
}
|
|
}
|