java - 每台计算机的独特之处
问题描述
我想在每台计算机上为 java 程序获取一个唯一的序列号我可以使用什么?Mac地址好帽子是我的问题的代码吗?a 已经有了这两个,哪个更好?
public static void main(String[] args){
InetAddress ip;
try {
ip = InetAddress.getLocalHost();
System.out.println("Current IP address : " + ip.getHostAddress());
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
byte[] mac = network.getHardwareAddress();
System.out.print("Current MAC address : ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
}
System.out.println(sb.toString());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Throwable {
// wmic command for diskdrive id: wmic DISKDRIVE GET SerialNumber
// wmic command for cpu id : wmic cpu get ProcessorId
//wmic command for bios :wmic bios get serialnumber
Process process = Runtime.getRuntime().exec(new String[] { "wmic", "csproduct", "get", "uuid" });
process.getOutputStream().close();
Scanner sc = new Scanner(process.getInputStream());
String property = sc.next();
String serial = sc.next();
System.out.println(property + ": " + serial);
}
一起使用 ProcessorId 和 uuid 是一种好方法吗?
解决方案
据我所知,没有什么是可以访问硬件的人无法伪造的。
如果您具有管理员权限,则可以在典型操作系统上的软件中相对轻松地更改 NIC 的 MAC 地址。
ProcessorId(由“wmic”报告)更难,因为它来自 BIOS,而操作系统将其视为只读属性;请参阅如何更改 ProcessorId。
然而:
- 可以通过BIOS 本身更改 ID,
- 用户可能会更换 BIOS,
- 用户可能会更新 BIOS 正在从中读取
ProcessorId
值的私有内存位置 (?)。 - 如果您的代码使用“wmic”来检索 ProcessorId,则可以将其替换为返回假 id 的版本
- 等等
即使假设您可以阻止用户伪造 id,如果他们可以旋转虚拟机,他们几乎肯定可以在虚拟机中伪造 id。
这意味着您开发的任何依赖于具有唯一、不可伪造(不可克隆)标识符的股票标准 Windows 系统的方案都存在根本缺陷。如果您真的需要不可伪造的 ID,您将不得不考虑替代方法,例如防篡改硬件“加密狗”。
另一方面,如果您愿意接受用户可以伪造 id 信息,那么结合 MAC 地址、ProcessorId 和/或类型 4 UUID 应该足以保证唯一性。(事实上,只要你有一个好的随机数来源,一个 4 类 UUID 本身就足够了。)
推荐阅读
- tensorflow - 如何在保留旧类性能的同时向现有对象检测器添加新类
- c - 如何使用通话返回的地址
- pdf - 将超链接添加到 PDF
- jquery - jQuery-ui 选项卡第一项保持关闭状态
- php - 如何从另一个表中获取数据并在 PHP Codeigniter 中的单个表上显示?
- c# - 在 Razorpage 上使用 MongoDB 实现 AspNetCore 自动化
- flutter - 在小部件之间画一条线并使这些线可点击
- javascript - 数学捕获需要添加到同一 html 页面上的两个选项卡?
- python-3.x - 将两个数据框导出为一个 excel 文件,在指定位置在 pandas 中使用两张工作表
- python - Python:无法将 json 格式(dict)值放入列表中