我想用java创建加密。
无论如何要获得CPU ID或PC中唯一的任何东西,如BIOS或...
例如System.getCpuId();
这只是一个例子
非常感谢...
答案 0 :(得分:6)
所以你想要一个识别用户计算机的唯一号码(或字符串?)?或者至少足够独特,重复的可能性非常低,对吗?
您可以获取网络接口的Mac地址。这做了很多假设,但它可能足以满足您的需求:
final byte[] address = NetworkInterface.getNetworkInterfaces().nextElement().getHardwareAddress();
System.out.println("address = " + Arrays.toString(address));
这为您提供了一个字节数组。您可以通过多种方式将其转换为id ...就像十六进制字符串一样。
当人们更换计算机中的硬件时,预计会得到支持。
答案 1 :(得分:4)
您无法(可靠地)获取纯Java中的硬件信息。您必须使用JNA或JNI。你能说明你正在构建什么样的加密系统,以及为什么需要硬件信息?
编辑:Steve McLeod已经注意到Java有NetworkInterface.getHardwareAddress()方法。但是,有一些严重的警告,包括并非所有Java实现都允许访问它,并且MAC地址可以是trivially forged。
答案 2 :(得分:4)
如果您需要唯一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
答案 3 :(得分:3)
我认为这种特定于操作系统的命令在Java中不可用。
This link显示了在Windows上运行它的方法。
答案 4 :(得分:2)
如果没有一些JNA / JNI库,就无法直接使用Java获取硬件信息。也就是说,可以使用System.getEnv()
获得“有些独特的系统特定值”。例如,
System.getEnv("COMPUTERNAME")
应该在Windows系统中返回计算机的名称。当然,这是非常不可取的。并且值可以在同一系统中随时间变化。或者在不同的系统中是相同的。哦,好吧......
答案 5 :(得分:2)
你真正想要的是一个很好的熵源,但我实际上建议你研究Java Cryptography Architechture,因为它提供了一个框架,所以你可以专注于你的实际算法。
http://java.sun.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html
答案 6 :(得分:2)
您还应该考虑一台机器可以有多个CPU / NIC /无论如何,因此可以有多个ID。