9

我想用java创建一个加密。
无论如何要获得CPU Id或PC中唯一的任何东西,例如BIOS或...

例如System.getCpuId();,这只是一个例子

非常感谢 ...

4

7 回答 7

5

所以你想要一个唯一的数字(或字符串?)来标识用户的计算机?或者至少足够独特以至于重复的机会非常低,对吧?

您可以获取网络接口的 Mac 地址。这是做出许多假设,但它可能足以满足您的需求:

final byte[] address = NetworkInterface.getNetworkInterfaces().nextElement().getHardwareAddress();
System.out.println("address = " + Arrays.toString(address));

这为您提供了一个字节数组。您可以通过多种方式将其转换为 id ......比如作为十六进制字符串。

不过,当人们更换计算机中的一些硬件时,希望得到支持。

于 2010-02-05T11:34:26.203 回答
4

我认为这种操作系统特定的命令在 Java 中不可用。

此链接显示了一种在 Windows 上运行它的方法。

于 2010-02-05T11:20:10.470 回答
3

您不能(可靠地)在纯 Java 中获取硬件信息。您将不得不使用JNAJNI。您能否说明您正在构建哪种加密系统,以及为什么需要硬件信息?

编辑:Steve McLeod 注意到 Java 有一个NetworkInterface.getHardwareAddress()方法。但是,有一些严重的警告,包括并非所有 Java 实现都允许访问它,而且 MAC 地址可以很容易地伪造

于 2010-02-05T11:18:03.797 回答
2

您还应该考虑一台机器可以有多个 CPU/NIC/任何东西,因此可以有多个 ID。

于 2010-02-05T12:03:05.310 回答
1

如果您需要唯一 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
于 2010-02-05T11:19:41.183 回答
1

如果没有一些 JNA/JNI 库,就无法直接使用 Java 获取硬件信息。也就是说,您可以使用System.getEnv(). 例如,

System.getEnv("COMPUTERNAME")

应该在 Windows 系统中返回计算机的名称。当然,这是非常不便携的。在同一系统中,这些值会随时间而变化。或者在不同的系统中是相同的。那好吧...

于 2010-02-05T11:22:37.993 回答
0

您真正要寻找的是一个很好的熵源,但我实际上建议您研究 Java Cryptography Architechture,因为它为此提供了一个框架,因此您可以专注于您的实际算法。

http://java.sun.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html

于 2010-02-05T11:22:59.193 回答