【问题标题】:How to get cpu-id in java?如何在java中获取cpu-id?
【发布时间】:2011-01-13 11:37:19
【问题描述】:

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

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

非常感谢...

【问题讨论】:

  • 是否需要对同一台机器给出相同的结果?听起来您只需生成一个随机密钥并存储它就可以逃脱?
  • 不,你知道为什么吗?因为我想获取 cpuid 然后生成一个代码,然后用户将它(生成的代码)发送给我,我发送给他们激活码 ...
  • 所以这真的是一个 DRM 方案吗?
  • @PeanutPower,不适合复制保护目的,因为它可以通过复制文件和注册表项来复制到另一台机器上。主板 ID 也可以伪造,但这需要更多努力。
  • 啊,又是一个许可证管理器。这将花费您更多的汗水、血和泪水,而不是您获得的收入。

标签: java encryption uniqueidentifier drm cpuid


【解决方案1】:

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

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

【讨论】:

  • 严格来说并非如此,如 java.net.NetworkInterface 类所示。
  • 你是对的。但请注意,并非所有实现都支持这种方法(请参阅java.sun.com/javase/6/docs/api/java/net/…),并非所有计算机都具有网卡,人们经常更换网卡(想想有线->无线),并且伪造地址是微不足道的。鉴于这一切,我认为这是一个死胡同。
【解决方案2】:

如果您需要唯一 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

【讨论】:

  • UUID的确切含义是什么?
  • UUID 在 JAVA 中是唯一的,用于需要通用唯一 ID 的领域
  • @Mike Redford:当然有些应用程序可以使用 UUID。它是通用的 :-)
  • 您需要将您生成的 UUID 存储在本地,以便稍后在您发送激活码时进行匹配。坚定的用户很容易解决这个问题。
  • 我认为 OP 想要一个稳定的标识符(即对于那台机器将保持不变)并且对伪造来说不是微不足道的。
【解决方案3】:

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

This link 显示了一种在 Windows 上运行它的方法。

【讨论】:

  • 谢谢它可能有用,我会检查它:)
  • 这其实很聪明!也应该有人将它移植到其他环境中,并将其全部打包到一个库中。
  • 嗯,Linux(我相信 OS X 也是如此)有 dmesg 和 uname 之类的命令以及 /proc/cpuinfo 之类的位置,它们提供各种与硬件相关的信息。因此,只需使用 System.exec 运行相关命令并解析其输出即可。当然,很难保证某些特定信息是可用的(或者它是正确的),但至少可以尝试。
  • 这个特定的命令可能是特定于体系结构的,而不是特定于操作系统的——例如,CPUID 指令和相关指令。也就是说,这可能会在 x86 上运行,所以我通常不认为这是一个大问题。
  • 这是最接近问题的正确答案
【解决方案4】:

如果没有一些 JNA/JNI 库,就无法直接使用 Java 获取硬件信息。也就是说,您可以通过System.getEnv() 获得“有些独特的系统特定值”。例如,

System.getEnv("COMPUTERNAME")

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

【讨论】:

  • 不用JNI、FWIW也能获取MAC地址
【解决方案5】:

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

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

【讨论】:

  • 用户希望 CPU ID 不是随机数。
【解决方案6】:

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

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

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

这会给你一个字节数组。您可以通过多种方式将其转换为 id……例如十六进制字符串。

但是,当人们更换计算机中的硬件时,希望得到支持。

【讨论】:

  • 这就是我所做的许多假设!如今,几乎每台计算机都是联网的,因此都有一个 NIC。但根据您的需要,这可能不是一个好的假设......
  • 我有一些使用它的软件,它真的,真的很烦人。我在家时通过有线连接将它安装在笔记本电脑上,然后在使用无线时无法使用。我知道您可以在网络连接中重新排序您的网络设备,但这很麻烦。
  • MAC 可以轻松更改。它不应该在同一个网络中运行两台机器
【解决方案7】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2011-03-29
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多