我想用java创建一个加密。
无论如何要获得CPU Id或PC中唯一的任何东西,例如BIOS或...
例如System.getCpuId();
,这只是一个例子
非常感谢 ...
我想用java创建一个加密。
无论如何要获得CPU Id或PC中唯一的任何东西,例如BIOS或...
例如System.getCpuId();
,这只是一个例子
非常感谢 ...
所以你想要一个唯一的数字(或字符串?)来标识用户的计算机?或者至少足够独特以至于重复的机会非常低,对吧?
您可以获取网络接口的 Mac 地址。这是做出许多假设,但它可能足以满足您的需求:
final byte[] address = NetworkInterface.getNetworkInterfaces().nextElement().getHardwareAddress();
System.out.println("address = " + Arrays.toString(address));
这为您提供了一个字节数组。您可以通过多种方式将其转换为 id ......比如作为十六进制字符串。
不过,当人们更换计算机中的一些硬件时,希望得到支持。
我认为这种操作系统特定的命令在 Java 中不可用。
此链接显示了一种在 Windows 上运行它的方法。
您不能(可靠地)在纯 Java 中获取硬件信息。您将不得不使用JNA或JNI。您能否说明您正在构建哪种加密系统,以及为什么需要硬件信息?
编辑:Steve McLeod 注意到 Java 有一个NetworkInterface.getHardwareAddress()方法。但是,有一些严重的警告,包括并非所有 Java 实现都允许访问它,而且 MAC 地址可以很容易地伪造。
您还应该考虑一台机器可以有多个 CPU/NIC/任何东西,因此可以有多个 ID。
如果您需要唯一 id,您可以使用UUID:
import java.util.UUID;
public class GenerateUUID {
public static final void main(String... aArgs){
//generate random UUIDs
UUID idOne = UUID.randomUUID();
UUID idTwo = UUID.randomUUID();
log("UUID One: " + idOne);
log("UUID Two: " + idTwo);
}
private static void log(Object aObject){
System.out.println( String.valueOf(aObject) );
}
}
示例运行:
>java -cp . GenerateUUID
UUID One: 067e6162-3b6f-4ae2-a171-2470b63dff00
UUID Two: 54947df8-0e9e-4471-a2f9-9af509fb5889
如果没有一些 JNA/JNI 库,就无法直接使用 Java 获取硬件信息。也就是说,您可以使用System.getEnv()
. 例如,
System.getEnv("COMPUTERNAME")
应该在 Windows 系统中返回计算机的名称。当然,这是非常不便携的。在同一系统中,这些值会随时间而变化。或者在不同的系统中是相同的。那好吧...
您真正要寻找的是一个很好的熵源,但我实际上建议您研究 Java Cryptography Architechture,因为它为此提供了一个框架,因此您可以专注于您的实际算法。
http://java.sun.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html