根据机器的CPU、主板、MAC地址生成唯一的激活码,授权认证
根据机器的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)
根据机器的CPU、主板、MAC地址生成唯一的激活码,授权认证
根据机器的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)