123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- package com.genersoft.iot.vmp.conf;
- //package net.roseboy.classfinal;
- import com.alibaba.fastjson2.JSON;
- import com.genersoft.iot.vmp.VManageBootstrap;
- import net.roseboy.classfinal.util.*;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.util.Base64Utils;
- import java.io.*;
- import com.genersoft.iot.vmp.utils.DateUtil;
- import com.genersoft.iot.vmp.utils.Md5Utils;
- import java.util.List;
- import java.util.Scanner;
- // 程序授权类. 用于控制程序的使用权限.
- public class Authorize {
- // 调用 lib/classfinal-fatjar.jar 中的方法. 用于获取机器码
- private final static Logger logger = LoggerFactory.getLogger(Authorize.class);
- private static String upCompany = "szhfy";
- public static String baseAuthorizeFilePath = "authorize/authorize.hfy";
- public static String baseMachineFilePath = "authorize/MachineCode.hfy";
- // 授权请求文件路径 (用于请求授权)
- private String authorizeFilePath = "authorize/authorize.hfy";
- Authorize(String authorizeFilePath) {
- this.authorizeFilePath = authorizeFilePath;
- }
- // 读取授权文件
- private static byte[] readAuthorizeFile(String path) {
- if(path == null) {
- path = baseAuthorizeFilePath;
- }
- logger.info("path: {}", path);
- File file = new File(path);
- if(!file.exists()) {
- logger.error("无法获取到授权文件. 请检查授权文件是否存在.");
- return null;
- }
- byte[] data = IoUtils.readFileToByte(file);
- // 解析授权文件
- return data;
- }
- /**
- * 生成机器码 96 位
- */
- public static String getMachineCode() {
- String code = new String(SysUtils.makeMarchinCode());
- return code;
- }
- public static String getAuthorizePasswd(String machineCode){
- return machineCode.substring(16, 32) + machineCode + machineCode.substring(64, 80);
- }
- // 检查授权文件是否存在
- public static boolean checkAuthorizeFile(String path) {
- if(path == null) {
- path = baseAuthorizeFilePath;
- }
- File file = new File(path);
- if(!file.exists()) {
- return false;
- }
- return true;
- }
- /**
- * 获取授权文件密文
- * @param authorizePath 授权文件路径
- * @return
- */
- public static String getEncryptAuthorData(String authorizePath) {
- byte[] authorizeCode = readAuthorizeFile(authorizePath);
- if (authorizeCode == null || authorizeCode.length == 0) {
- logger.error("授权文件读取失败. 请检查授权文件是否存在. ");
- return null;
- }
- // 使用 base64 转换文本
- byte[] data = Base64Utils.encode(authorizeCode);
- String code = new String(data);
- logger.info("code: {}", code);
- return code;
- }
- /**
- * 解密授权文件
- * @param authorizePath 授权文件路径
- * @return
- */
- public static String decryptAuthorizeFile(String machineCode, String authorizePath) {
- byte[] authorizeCode = readAuthorizeFile(authorizePath);
- if (machineCode == null) {
- logger.error("机器码解析失败");
- return null;
- }
- if(authorizeCode == null || authorizeCode.length == 0) {
- logger.error("授权文件读取失败. 请检查授权文件是否存在. ");
- return null;
- }
- try{
- // 使用 base64 转换文本
- byte[] data = Base64Utils.decode(authorizeCode);
- String code = new String(data);
- // logger.info("code: {}", code);
- // 解密授权文件
- String password = getAuthorizePasswd(machineCode);
- String decryptStr = AesUtils.decrypt(code, password);
- // logger.info("decryptStr: {}", decryptStr);
- return decryptStr;
- }catch (Exception e) {
- logger.error("授权文件解析失败. 请检查练习管理员进行排查. ");
- logger.error("错误信息: {}", e.getMessage());
- return null;
- }
- }
- // 生成授权文件
- public static boolean saveAuthorizeFile(String authorizePath, String authorizeJson) {
- try{
- String machineCode = getMachineCode();
- if (machineCode == null) {
- logger.error("机器码获取失败. 请检查联系管理员. ");
- return false;
- }
- if(authorizeJson == null || authorizeJson.length() == 0) {
- logger.error("授权码获取失败. 请检查授权码是否正确. ");
- return false;
- }
- // 机器码长度转换 96 位 到128位 从16位 开始 取 16个字符 添加至机器码前方 再从 64位开始取 16个字符 添加至机器码后方
- String key = getAuthorizePasswd(machineCode);
- // 解密授权文件
- String encryptStr = AesUtils.encrypt(authorizeJson, key);
- // 使用 base64 转换文本
- byte[] data = Base64Utils.encode(encryptStr.getBytes());
- String code = new String(data);
- // 授权数据写入文件
- File file = new File(authorizePath);
- if(file.exists()) {
- file.delete();
- }
- file.createNewFile();
- IoUtils.writeTxtFile(file, code);
- // 机器码写入文件
- File machineFile = new File(baseMachineFilePath);
- if(machineFile.exists()) {
- machineFile.delete();
- }
- machineFile.createNewFile();
- IoUtils.writeTxtFile(machineFile, machineCode);
- return true;
- }catch (Exception e) {
- logger.error("授权文件生成失败. 请检查练习管理员进行排查. ");
- logger.error("错误信息: {}", e.getMessage());
- return false;
- }
- }
- // 基础授权文件解析
- public static AuthorData parseBaseAuthorizeFile(String machineCode, String authorizePath) {
- String data = decryptAuthorizeFile(machineCode, authorizePath);
- if(data == null) {
- return null;
- }
- // logger.info("data: {}", data);
- // json 解析 fastjson2 依赖
- AuthorData authorData = JSON.parseObject(data, AuthorData.class);
- // 输出解析结果
- logger.info("机器码: {}", authorData.getMachineCode());
- logger.info("公司名: {}", authorData.getCompany());
- logger.info("授权码: {}", authorData.getAuthorizeCode());
- logger.info("请求授权时间: {}", authorData.getAuthorizeTime());
- // logger.info("用户密码: {}", authorData.getPassword());
- return authorData;
- }
- // 创建授权文件
- public static boolean generateAuthorizeFile(String authorizePath, String company, String userPassword) {
- String machineCode = getMachineCode();
- AuthorData authorData = new AuthorData();
- if (machineCode == null) {
- logger.error("机器码获取失败. 请检查联系管理员. ");
- return false;
- }
- if(company == null || company.length() == 0) {
- logger.error("公司名获取失败. 请检查公司名是否正确. ");
- return false;
- }
- if(userPassword == null || userPassword.length() == 0) {
- logger.error("用户密码获取失败. 请检查用户密码是否正确. ");
- return false;
- }
- authorData.setMachineCode(machineCode);
- authorData.setCompany(company);
- authorData.setPassword(userPassword);
- // 获取当前时间,使用 ISO8601 格式
- authorData.setAuthorizeTime(DateUtil.getNowForISO8601());
- // 构建授权码 md5(机器码 + 公司名 + 授权时间)
- String authorizeCode = Md5Utils.hash(upCompany + machineCode + company + authorData.getAuthorizeTime());
- authorData.setAuthorizeCode(authorizeCode);
- // 转为 json 字符
- String jsonStr = JSON.toJSONString(authorData);
- return saveAuthorizeFile(authorizePath, jsonStr);
- }
- // 读取授权批准文件
- public static byte[] readAuthorizeApproveFile(String path) {
- if(path == null) {
- path = baseAuthorizeFilePath;
- }
- logger.info("path: {}", path);
- File file = new File(path);
- if(!file.exists()) {
- logger.error("无法获取到授权批准文件. 请检查授权批准文件是否存在.");
- return null;
- }
- byte[] data = IoUtils.readFileToByte(file);
- // 解析授权文件
- return data;
- }
- }
|