springboot根據部署服務器生成機器碼+加密生成到期時間授權碼設置項目在服務器的到期時間

生成機器碼

首先需要在后端寫個獲取window或linux的機器碼,根據CPU序列號和硬盤序列號(Windows),拼接得到

/*** 操作系統的工具類*/
public class OSUtils {/*** 獲取window or linux機器碼** @return*/public static String getOSNumber() {Map<String, Object> codeMap = new HashMap<>(2);String result = "";if (isWindows()) {String processorId = getCPUSerialNumber();codeMap.put("pid", processorId);String serialNumber = getHardDiskSerialNumber();codeMap.put("snm", serialNumber);String codeMapStr = JSON.toJSONString(codeMap);String serials = Md5Utils.md5(codeMapStr, SALT);result = getSplitString(serials, "-", 8);} else {codeMap.put("hmi", getHostMachineId());codeMap.put("nwi", getContainerNetworkId());String codeMapStr = JSON.toJSONString(codeMap);String serials = Md5Utils.md5(codeMapStr, SALT);result = getSplitString(serials, "-", 8);}return result;}/*** 獲取CPU序列號** @return* @throws IOException*/public static String getCPUSerialNumber() {String next;try {Process process = Runtime.getRuntime().exec(new String[]{"wmic", "cpu", "get", "ProcessorId"});process.getOutputStream().close();Scanner sc = new Scanner(process.getInputStream());String serial = sc.next();next = sc.next();} catch (IOException e) {throw new RuntimeException("獲取CPU序列號失敗");}return next;}/*** 獲取 硬盤序列號(Windows)** @return* @throws IOException* @throws InterruptedException*/public static String getHardDiskSerialNumber() {try {Process process = Runtime.getRuntime().exec(new String[]{"wmic", "path", "win32_physicalmedia", "get", "serialnumber"});process.getOutputStream().close();Scanner sc = new Scanner(process.getInputStream());String serial = sc.next();return sc.next();} catch (IOException e) {throw new RuntimeException("獲取硬盤序列號失敗");}}/*** 獲取系統序列號(linux)** @return*/public static String getHostMachineId() {try {Path path = Paths.get("/etc/machine-id");if (Files.exists(path)) {String content = new String(Files.readAllBytes(path));if (!content.isEmpty()) {return content;}}} catch (Exception e) {System.out.println("獲取序列號失敗: " + e.getMessage());}return "unknown_host_id";}public static String getContainerNetworkId() {String interfaceName = "eth0"; // 默認網卡名稱(可配置化)try {Path addressPath = Paths.get("/sys/class/net/" + interfaceName + "/address");if (Files.exists(addressPath)) {String mac = new String(Files.readAllBytes(addressPath));return mac.replace(":", ""); // 去除冒號,簡化格式}} catch (Exception e) {e.printStackTrace();}return "unknown_mac";}private static String getSplitString(String str, String split, int length) {int len = str.length();StringBuilder temp = new StringBuilder();for (int i = 0; i < len; i++) {if (i % length == 0 && i > 0) {temp.append(split);}temp.append(str.charAt(i));}return temp.toString();}public static boolean isWindows() {return System.getProperty("os.name").toLowerCase().contains("windows");}
}

這塊寫好后再啟動程序寫打印機器碼

都寫好后就可以打包上傳服務器,在服務器內編譯生成服務器的機器碼,獲取保存下來

public static void main(String[] args) {System.out.println("機器碼:" + OSUtils.getOSNumber());// System.setProperty("spring.devtools.restart.enabled", "false");SpringApplication.run(YanfanApplication.class, args);}

生成公鑰、私鑰、授權碼

把下面這段在自己的工具類里找個地方寫,寫aes加密,機器碼+時間的,執行這個main方法,打包的時候不要打包進去,會被反編譯

public static void main(String[] args) throws Exception {// 1. 生成密鑰對KeyPair keyPair = RSAUtils.generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 2. 獲取密鑰字符串(模擬存儲/傳輸)String publicKeyStr = RSAUtils.getPublicKeyString(publicKey);String privateKeyStr = RSAUtils.getPrivateKeyString(privateKey);// 公鑰:// publicKeyStr = "";System.out.println("publicKeyStr: " + publicKeyStr);// 私鑰: 不要將自己的私鑰放到這里!!!!!// privateKeyStr = "";System.out.println("privateKeyStr: " + privateKeyStr);// 私鑰加密,私鑰自己保留String data = RSAUtils.encryptWithPrivateKey(OS_NUMBER + "2099-12-31 23:59:59", RSAUtils.getPrivateKey(privateKeyStr));
//        String data = RSAUtils.encryptWithPrivateKey("038e-1ee5-ee15-4005-18ce-15b7-312d-78ee" + "2099-12-31 23:59:59", RSAUtils.getPrivateKey(privateKeyStr));
//        String data = RSAUtils.encryptWithPrivateKey(
//                "038e-1ee5-ee15-4005-18ce-15b7-312d-78ee" + "2025-06-25 23:59:59",
//                RSAUtils.getPrivateKey(privateKeyStr)
//        );System.out.println(data);// 公鑰解密,公鑰提供給客戶System.out.println(RSAUtils.decryptWithPublicKey(data, RSAUtils.getPublicKey(publicKeyStr)));}

私鑰自己保存好,公鑰放在服務器客戶端,授權碼放在數據庫sys_config,看下面

服務器修改客戶端公鑰

生成的公鑰需要粘到服務器的private-key授權碼對應的密鑰

在這里插入圖片描述

授權碼找到系統數據庫的sys_config表內

在這里插入圖片描述

全部改好后,寫一個授權碼監聽事件,到期系統自動停止

如果想要測試本地是否執行成功的,把監聽事件關閉,但是上傳服務器的時候要打開,不然授權碼這個寫了也沒用

/*** 授權碼監聽事件*/
@Component
@Slf4j
@Order(0)
public class AuthOSValidListener implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {// 啟用授權碼功能validate();}public void validate() {// 開啟驗證機器碼new AuthOsValidUtil().verification();}@Scheduled(cron = "0 0/10 * * * ?")   //10執行一次private void validateTime() {validate();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908845.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908845.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908845.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Thumb-2指令集及其與STM32的關系

Thumb-2指令集及其與STM32的關系&#xff1a; 1. Thumb-2指令集是什么&#xff1f; 本質&#xff1a;Thumb-2是ARM公司設計的混合指令集架構&#xff0c;首次在ARMv7架構中引入&#xff08;如Cortex-M3/M4/M7&#xff09;。 核心創新&#xff1a; 融合了傳統 32位ARM指令&…

Haption 力反饋遙操作機器人:6 自由度 + 低延遲響應,解鎖精準遠程操控體驗

Haption自2001年成立以來&#xff0c;始終專注于力反饋設備與定制化解決方案的設計、研發及銷售。作為工業級力反饋技術的先行者&#xff0c;其核心產品以高精度交互與可靠性著稱&#xff0c;已與達索系統、空客、Orano 等行業頭部企業達成深度合作&#xff0c;業務覆蓋工程仿真…

C# ExcelWorksheet 貼圖

C# ExcelWorksheet 貼圖 在C#中,如果你想在Excel工作表中插入圖片(例如,在ExcelWorksheet中貼圖),你可以使用ClosedXML或EPPlus這樣的庫來操作Excel文件。下面我將分別介紹如何使用這兩個庫來實現這一功能。 使用ClosedXML 首先,確保你已經安裝了ClosedXML包。你可以通…

Android15默認授權浮窗權限

我們經常有那種需求&#xff0c;客戶需要定制的apk集成在ROM中&#xff0c;并且默認授予其【顯示在其他應用的上層】權限&#xff0c;也就是我們常說的浮窗權限&#xff0c;那么我們就可以通過以下方法在wms、ams等系統服務的systemReady()方法中調用即可實現預置應用默認授權浮…

莫蘭迪高級灰總結計劃簡約商務通用PPT模版

莫蘭迪高級灰總結計劃簡約商務通用PPT模版&#xff0c;莫蘭迪調色板清新簡約工作匯報PPT模版&#xff0c;莫蘭迪時尚風極簡設計PPT模版&#xff0c;大學生畢業論文答辯PPT模版&#xff0c;莫蘭迪配色總結計劃簡約商務通用PPT模版&#xff0c;莫蘭迪商務匯報PPT模版&#xff0c;…

無人機EN 18031歐盟網絡安全認證詳細解讀

EN 18031 是歐盟針對無線電設備發布的網絡安全標準&#xff0c;于 2024 年 8 月正式發布&#xff0c;2025 年 1 月 30 日被列入《無線電設備指令》&#xff08;RED&#xff09;協調標準清單&#xff0c;并于 2025 年 8 月 1 日起強制執行。以下是對無人機 EN 18031 歐盟網絡安全…

Linux離線(zip方式)安裝docker

目錄 基礎信息操作系統信息docker信息 安裝實例安裝步驟示例 遇到的問題問題1&#xff1a;修改默認工作路徑啟動失敗問題2 找不到對應組 基礎信息 操作系統信息 OS版本&#xff1a;CentOS 7 64位 內核版本&#xff1a;3.10.0 相關命令&#xff1a; uname -rcat /etc/os-rele…

Go 語言中switch case條件分支語句

1. 基本語法 package main import "fmt" func main() {var extname ".css"switch extname {case ".html":fmt.Println("text/html")case ".css":fmt.Println("text/css") // text/csscase ".js":fmt.…

FFmpeg:Windows系統小白安裝及其使用

一、安裝 1.訪問官網 Download FFmpeg 2.點擊版本目錄 3.選擇版本點擊安裝 注意這里選擇的是【release buids】&#xff0c;注意左上角標題 例如我安裝在目錄 F:\FFmpeg 4.解壓 5.添加環境變量 把你解壓后的bin目錄&#xff08;即exe所在文件夾&#xff09;加入系統變量…

LLM基礎2_語言模型如何文本編碼

基于GitHub項目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 字節對編碼(BPE) 上一篇博文說到 為什么GPT模型不需要[PAD]和[UNK]&#xff1f; GPT使用更先進的字節對編碼(BPE)&#xff0c;總能將詞語拆分成已知子詞 為什么需要BPE&#xff1f; 簡…

監控升級:可視化如何讓每一個細節 “說話”

你有沒有遇到過這樣的情況&#xff1f; 監控畫面里明明有“異常”&#xff0c;但值班人員愣是沒發現&#xff1b; 報警響起卻不知道具體發生了什么&#xff0c;只能靠猜、靠翻錄像&#xff1b; 出了事回看錄像&#xff0c;才發現線索早就在眼前&#xff0c;只是沒人注意到………

單片機bootloader(APP的自我復制)

文章目錄 Bootloader 中 APP 的自我復制與啟動機制解析一、為什么要進行自我復制?二、程序整體結構概述三、匯編啟動代碼分析重點解釋:四、C 語言部分分析核心功能:五、start\_app 函數:手動啟動指定 APP六、總結七、適用場景Bootloader 中 APP 的自我復制與啟動機制解析 …

瀏覽器工作原理11 [#] this:從JavaScript執行上下文視角講this

引用 《瀏覽器工作原理與實踐》 在上篇文章中&#xff0c;我們講了詞法作用域、作用域鏈以及閉包&#xff0c;并在最后思考題中留了下面這樣一段代碼 var bar {myName:"time.geekbang.com",printName: function () {console.log(myName)} } function foo() {le…

【C語言】-遞歸

1、遞歸概念 遞歸&#xff08;Recursion&#xff09;是編程中一種重要的解決問題的方法&#xff0c;其核心思想是函數通過調用自身來解決規模更小的子問題&#xff0c;直到達到最小的、可以直接解決的基準情形&#xff08;Base Case&#xff09;。 核心&#xff1a;自己調用…

12.5Swing控件3Jpanel JOptionPane

JPanel JPanel是一個輕量級容器組件&#xff0c;用于組織和管理其他 GUI 組件。它繼承自JComponent類&#xff0c;屬于javax.swing包&#xff0c;可以容納按鈕、文本框、標簽等控件 JPanel 默認使用的布局管理器是 FlowLayout&#xff0c;也可以嵌套其他面板&#xff0c;以便…

MIPI信號為什么不能進行長距離傳輸

1.關于MIPI信號傳輸 MIPI信號是不適合長距離傳輸的。 2.MIPI的信號擺幅小&#xff0c;抗干擾能力比較弱 MIPI信號的差分擺幅比較小&#xff0c;通常只有100mV~200mV,遠遠低于LVDS的350mV的擺幅 小擺幅信號在長線纜上傳輸的時候更容易被噪聲淹沒&#xff0c;信噪比下降&#xf…

Qt的學習(二)

1. 創建Hello Word 兩種方式&#xff0c;實現helloworld&#xff1a; 1.通過圖形化的方式&#xff0c;在界面上創建出一個控件&#xff0c;顯示helloworld 2.通過純代碼的方式&#xff0c;通過編寫代碼&#xff0c;在界面上創建控件&#xff0c; 顯示hello world&#xff1b; …

Windows11+VS2019配置Libigl-2.4.1

Windows11VS2019配置Libigl-2.4.1 由于課題需要&#xff0c;所以出一篇配置Libigl的博客&#xff0c;制作不易&#xff0c;請多多點贊 一、官網下載 官網&#xff1a;https://libigl.github.io/ GitHub下載地址&#xff1a;https://github.com/libigl/libigl 這里我們選擇…

地球科學方向(Geoscience and Remote Sensing),1天見刊,當月可檢索!

CSP科學出版社&#xff0c;旨在通過為研究人員提供最佳環境來發表、參考、閱讀和引用他們的作品&#xff0c;從而為科學界服務。現已與科檢易學術達成出版戰略合作&#xff0c;現在聯合共同出版高質量學術水平的期刊&#xff0c;為方便廣大科研學者投稿方便&#xff0c;現已經建…

基于 Three.js 的 3D 模型快照生成方案

基于 Three.js 的 3D 模型快照生成方案 此方案通過 Three.js 渲染場景并異步生成圖像數據&#xff0c;同時支持分辨率縮放和 Blob 格式輸出&#xff0c;為模型預覽、截圖保存等需求提供完整解決方案。 問題分析&#xff1a; 使用html2canvas 生成的快照畫布顯示為空&#xff…