admin管理员组

文章数量:1530017

根据机器的CPU、主板、MAC地址生成唯一的激活码,授权认证

  • Dagon_Code
    • 判断是否为虚拟机或者容器
    • Windows下
      • 获取CPU序列号
      • 获取主板序列号
      • 获取本机所有MAC地址信息
    • Linux下
      • 执行命令
      • 执行命令后获取信息
    • 根据获取的机器信息,生成唯一的激活码。
      • 激活码生成策略
        • 加密算法介绍
        • 加密方案设计
    • 具体代码实现

参考了网上许多博客,文章,最后总结出来。

https://github/Dagon0577/Dagon_Code

Dagon_Code

从Windows,Linux获取CPU,主板,MAC地址,虚拟ID(docker,machine-rkt),并生成Dagon_Code。

判断是否为虚拟机或者容器

首先判断是否为虚拟机或者是容器,若不是,再去物理机下获取。(相关方法在下文)

/**
     * 判断是否为容器、虚拟机,返回虚拟ID
     *
     * @return
     */
    public static String getVirtualID() {
   
        String execResult = executeLinuxCmd("systemd-detect-virt");
        if (!execResult.contains("none")) {
   
            //docker容器
            String VirtualID = getSerialNumber("cat /proc/1/cgroup", "docker", "docker/");
            if (VirtualID != null) {
   
                return VirtualID;
            }
            //machine-rkt
            VirtualID = getSerialNumber("cat /proc/1/cgroup", "machine-rkt", "machine-rkt\\");
            if (VirtualID != null) {
   
                VirtualID.replaceAll("\\x2d", "-");
                return VirtualID;
            }
            //vmware
            VirtualID = getSerialNumber("dmidecode -t system", "UUID", ":");
            if (VirtualID != null) {
   
                return VirtualID;
            }
            return "UNKNOWN";
        }
        return null;
    }

Windows下

通过创建vbs脚本,然后使用Runtime.getRuntime().exec()执行脚本,获取序列号等信息。

获取CPU序列号

 /**
     * 获取CPU序列号
     *
     * @return
     */
    public static String getCPUSerial() {
   
        String result = "";
        try {
   
            File file = File.createTempFile("tmp", ".vbs");
            file.deleteOnExit();
            FileWriter fw = new java.io.FileWriter(file);
            String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
                    + "Set colItems = objWMIService.ExecQuery _ \n"
                    + "   (\"Select * from Win32_Processor\") \n"
                    + "For Each objItem in colItems \n" + "    Wscript.Echo objItem.ProcessorId \n"
                    + "    exit for  ' do the first cpu only! \n" + "Next \n";

            // + "    exit for  \r\n" + "Next";
            fw.write(vbs);
            fw.close();
            String path = file.getPath().replace("%20", " ")

本文标签: 主板激活码机器地址CPU