1

我正在构建一个应用程序(在 java 中),我想为自己提供一些对其性能的测量。我正在计时多个长时间运行的进程,并且我有一个用于接收指标的 Web 服务器,但是我想为特定用户创建一个唯一的数字(我的程序不需要登录)在计算机上。

因此,如果 Joe 登录到计算机 A 并运行我的应用程序,它将给他一个唯一的号码,例如 1234。然后如果 Jane 登录到同一台计算机,它将使用不同的号码,例如 4321。但是,如果 Joe 登录到计算机B,它将完全创建一个单独的数字,例如 5678。另外(只是为了澄清)如果乔重新登录到计算机 A,它仍然会产生数字 1234。

另外,为了让它更具挑战性,如果同一台计算机在不同的网络上,那么我最好想要一个不同的 ID。

这些数字是任意的,并且会比这更长。到目前为止,我的代码8akb7d3n7lp1i1jo6apfhegp593kja5hg38b6o1a5godm38g97omm7bmc3jekc6apopgjhf9g从以下位置生成为我的 UID:

try {
    byte[] mac = NetworkInterface.getByInetAddress(InetAddress.getLocalHost()).getHardwareAddress();
    String names = new BigInteger(mac).toString(16) + InetAddress.getLocalHost().getHostAddress() + get("user.name") + get("os.version") + get("java.vendor");
    BigInteger uid = new BigInteger(names.getBytes());
    thisUsersUid = uid.toString(26);
} catch (SocketException ex) {
    Logger.getLogger(TimingLogger.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnknownHostException ex) {
    Logger.getLogger(TimingLogger.class.getName()).log(Level.SEVERE, null, ex);
}

我不希望这些信息容易阅读(如您所见names="-f4b86eb8ee1192.168.0.20lee10.6.8Apple Inc."),因此我将为其添加一个散列函数。

所以我的问题,毕竟这些宣传是:这是一个好方法吗?有没有比这更好的图书馆?还是我只是想要太多?

在此先感谢(即使是那些说:为什么?)

4

3 回答 3

4

你可以使用UUIDs

在 Java 中:UUID id = UUID.randomUUID();

于 2012-06-17T01:07:48.877 回答
3

你的问题并不完全清楚,所以我将陈述一些假设。

  • 您的应用程序安装在用户的 PC 上。(它不是受沙盒限制访问的小程序或类似的东西。)
  • UID 由运行在用户计算机上的应用程序生成,而不是由服务器生成。
  • 您不需要能够从 UID 中恢复用户名和机器身份;即它只是一个不透明的标识符。
  • 您的解决方案不需要是安全的。(如果用户决定在同一台机器上搞乱并生成不同的 UID,那并不重要。)

如果是这样,这里有几个选项。

  • 第一次运行应用程序时,生成一个随机的 UUID 并将其存储在用户的主目录或首选项中。随后,在应用程序存储它的位置查找现有 UUID。

  • 生成 UID 作为用户帐户名和机器 MAC 地址的 MD5(或类似)哈希。这应该在重新启动后保持稳定……除非用户 PC 的实现方式有什么奇怪的地方。

(如果安全是主要问题,那么第一种方法不适用 - 您必须假设用户可以找到并删除保存的 UUID。在第二种情况下,您遇到的问题是用户可能会欺骗他的帐户名和/或更改PC 的 MAC 地址。对于任何方案,您都会遇到更大的问题,即在用户 PC 上安装或运行的任何软件都可能被黑客入侵,以用用户想要的东西替换 UID。简而言之,您正在与失败作斗争如果你的用户有黑客技能和动机,那就战斗吧。)


有没有比这更好的图书馆?还是我只是想要太多?

我不知道现有的图书馆会这样做。

于 2012-06-17T01:29:15.443 回答
1

这是一个很好的加密哈希函数的应用程序。最先进的是 SHA-2。正如你所做的那样,连接所有独立的数量以某种可重复的方式构建一个字符串,并通过哈希运行它以获得一个 256 位(32 字节)的值。

您选择包括 OS 和 Java 供应商似乎很奇怪,因为这意味着例行升级或更改可能会产生新的 ID。根据您给出的标准,MAC、IP 和用户名对我来说似乎是最佳组合。

于 2012-06-17T01:24:43.180 回答