代码如下:
public class MachineCodeUtil {
public static void main(String[] args) {
SystemInfo systemInfo = new SystemInfo();
HardwareAbstractionLayer hal = systemInfo.getHardware();
String cpuSerial = getCpuSerial(hal.getProcessor());
System.out.println("CPU序列号:" + cpuSerial);
String diskSerial = getDiskSerial(systemInfo);
System.out.println("磁盘序列号:" + diskSerial);
String motherboardSerial = getMotherboardSerial(hal.getComputerSystem());
System.out.println("主板序列号:" + motherboardSerial);
String memorySerial = getMemorySerial(hal.getMemory());
System.out.println("内存大小:" + memorySerial);
String combinedInfo = cpuSerial + diskSerial + motherboardSerial + memorySerial;
String machineCode = SecureUtil.sha256(combinedInfo);
System.out.println("Unique Machine Code: " + machineCode);
}
/**
* CPU序列号
* @param processor
* @return
*/
private static String getCpuSerial(CentralProcessor processor) {
return processor.getProcessorIdentifier().getProcessorID();
}
/**
* 操作系统所在磁盘的驱动器UUID
* @param si
* @return
*/
private static String getDiskSerial(SystemInfo si) {
String systemDrive = System.getenv("SystemDrive") + File.separator;
StringBuilder serials = new StringBuilder();
List<OSFileStore> stores = si.getOperatingSystem().getFileSystem().getFileStores();
for (OSFileStore store : stores) {
if (systemDrive.equals(store.getMount())) {
serials.append(store.getUUID());
break;
}
}
return serials.toString().trim();
}
/**
* 主板序列号
* @param computerSystem
* @return
*/
private static String getMotherboardSerial(ComputerSystem computerSystem) {
return computerSystem.getBaseboard().getSerialNumber();
}
/**
* 内存总大小
* @param memory
* @return
*/
private static String getMemorySerial(GlobalMemory memory) {
return String.valueOf(memory.getTotal());
}
}补充阅读#
解释 Java 硬件信息生成机器标识的组成,补充稳定性、空值与隐私检查。
如何理解与使用#
示例组合处理器、磁盘和主板信息,实际可读取字段受硬件、权限与虚拟化环境影响;有些设备可能缺少序列号。
验证与边界#
测试设备重启、硬件更换和虚拟机复制后的结果。硬件指纹不能自动保证全球唯一,也不适合作为秘密凭据,应尽量减少暴露原始标识。
