Java获取电脑硬件信息做license

项目做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>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值