项目做license,分为两部部分:
一、一个小应用获取电脑的硬件信息(硬件的CPU的ID,和主板信息)生成唯一标识码
二、Java服务获取应用信息,生成唯一标识码,其他地方调用。
得到的字符串利用DES对其进行加密
.exe应用利用python写一个简单的获取脚本:
ComputerUniqueCode.py
import wmi
import json
from pyDes import *
import base64
class ComputerUniqueCode:
def __init__(self):
self.Des_Key = "DESCRYPT" # Key
self.Des_IV = "\x15\1\x2a\3\1\x23\2\0" # 自定IV向量
global s
s = wmi.WMI()
# 1. 获取硬件信息,输出 macode
# 1.CPU序列号(ID) 2.本地连接 无线局域网 以太网的MAC 3.硬盘序列号(唯一) 4.主板序列号(唯一)
# cpu 序列号
def get_CPU_info(self):
cpu = []
cp = s.Win32_Processor()
for u in cp:
cpu.append(
{
"Name": u.Name,
"Serial Number": u.ProcessorId,
"CoreNum": u.NumberOfCores
}
)
return cpu
# 主板序列号
def get_mainboard_info(self):
mainboard = []
for board_id in s.Win32_BaseBoard():
mainboard.append(board_id.SerialNumber.strip().strip('.'))
return mainboard
# 由于机器码太长,故选取机器码字符串部分字符
# E0:DB:55:B5:9C:16BFEBFBFF00040651W3P0VKEL6W8T1Z1.CN762063BN00A8
def getCombinNumber(self):
b = self.get_CPU_info()
d = self.get_mainboard_info()
machinecode_str = ""
if len(b) != 0:
machinecode_str = machinecode_str + b[0]['Serial Number']
if len(d) != 0:
machinecode_str = machinecode_str + d[0]
return machinecode_str
# DES+base64加密
def Encrypted(self, tr):
k = des(self.Des_Key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5)
EncryptStr = k.encrypt(tr)
# EncryptStr = binascii.unhexlify(k.encrypt(str))
### print('注册码:',base64.b64encode(EncryptStr))
return base64.b64encode(EncryptStr) # 转base64编码返回
# #des+base64解码
def DesDecrypt(self, tr):
k = des(self.Des_Key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5)
DecryptStr = k.decrypt(base64.b64decode(tr))
return DecryptStr # 转base64解码返回
# 获取mcode
def get_mcode(self):
mcode = self.getCombinNumber()
if mcode != "" and mcode is not None:
return self.Encrypted(mcode)
else:
return "未获取计算机唯一码"
界面:ComputerUnique.py
import tkinter as tk
from ComputerUniqueCode import ComputerUniqueCode
window = tk.Tk()
# 设置窗口的标题
window.title("电脑唯一码")
# 设置不可放大缩小
window.resizable(0, 0)
# 设置窗口得到位置
# 得到屏幕宽度
sw = window.winfo_screenwidth()
# 得到屏幕高度
sh = window.winfo_screenheight()
# 得到屏幕高度
ww = 500
wh = 250
x = (sw - ww) / 2
y = (sh - wh) / 2
window.geometry("%dx%d+%d+%d" % (ww, wh, x, y))
# 设置窗口大小
window.maxsize(ww, wh)
window.minsize(ww, wh)
# 设置结果显示文本
result_data_Text = tk.Text(window, width=70, height=12) # 标签长宽
# 在窗口中放置结果显示文本
result_data_Text.pack()
# 获取按钮点击事件
def hit_me():
cuc = ComputerUniqueCode()
result_data_Text.insert(1.0, cuc.get_mcode())
# 点击按钮
b = tk.Button(window,
text='获取', # 显示在按钮上的文字
width=15, height=2,
command=hit_me, activeforeground='white',
activebackground='red') # 点击按钮式执行的命令
# 在窗口中放置按钮
b.pack(side=tk.RIGHT, padx=10, pady=10)
# 进入消息循环
window.mainloop()
打包用pyinstall,打包的时候注意python版本与os的版本的兼容性。
Java服务主要代码:
public static void main(String[] args) throws Exception {
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
String mainboardid = hal.getComputerSystem().getBaseboard().getSerialNumber();
String cpuid = hal.getProcessor().getProcessorIdentifier().getProcessorID();
String mcode = cpuid + mainboardid;
String Des_Key = "DESCRYPT";
byte[] Des_IV = new byte[]{(byte) 0x15, (byte) 0x1, (byte) 0x2a, (byte) 0x3, (byte) 0x1, (byte) 0x23, (byte) 0x2, (byte) 0x0};
DES des = new DES(Mode.CBC, Padding.PKCS5Padding, Des_Key.getBytes(), Des_IV);
String e_mcode = StrUtil.str(Base64.getEncoder().encode(des.encrypt(mcode)), CharsetUtil.CHARSET_GBK);
System.out.println(e_mcode);
}
pom.xml
<dependencies>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.9.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.9.0</version>
</dependency>
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>5.8.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.15</version>
</dependency>
</dependencies>