【问题标题】:Java - generate machine specific encryption keyJava - 生成机器特定的加密密钥
【发布时间】:2015-12-10 12:56:25
【问题描述】:

我正在编写一个将加密对象映射序列化到文件的类,以维护用户登录数据等。
这个想法是能够始终在同一台机器上使用这个类来恢复和解密数据,但不能在其他机器上。
为此(如this SO post 和其他文章中所建议),我正在迭代网络接口的硬件地址,同时使用它们来散列默认常量键:

byte[] key = getConstKey();
Enumeration<NetworkInterface> inters = networkInterface.getNetworkInterfaces();
while (inters.hasMoreElements()) {
    NetworkInterface inter = inters.nextElement();
    if (inter.getHardwareAddress() == null) {
      continue;
    }
    hashKeyAccordingToAddress(key, inter.getHardwareAddress());
}

这很好用并且通过了我所有的测试,直到有一天我把我的笔记本电脑带出办公室......

显然,当我更改网络时,某些网络地址已更改,或者接口已添加/删除。我的假设是只有真正的硬件修改才会改变生成的密钥。我想我错了。

有没有办法让它更健壮,比如只使用更稳定的特定NetworkInterfaces?或者有没有更好的方法来生成机器唯一持久密钥?

更新:更具体地说,当我从办公室外连接到 VPN 服务时,问题就开始了。由于某些登录详细信息用于通过此 VPN 连接到服务,因此我的解决方案变得毫无用处..

【问题讨论】:

  • 您可以使用几乎不会改变的硬件信息,例如高清序列号、主板序列号...
  • java 是否利用获取此类信息?我能得到的唯一硬件信息是 inet 地址。
  • AFAIK 没有 API 可以直接从 java 执行此操作,您必须调用操作系统命令才能执行此操作。例如在 Windows 中,您可以使用 WMI 调用,例如:wmic diskdrive get serialnumber
  • wmic 仅在 WMI 被激活、运行并具有相应信息的情况下才有效 - 它通常是使用 wmic 的最糟糕的方法,另外:从网卡收集信息是一个非常糟糕的主意,因为这些可能是完全配置和/甚至配置自己,这基本上意味着您的硬件数据可能随时更改。唯一比较稳定的信息可能是 CPU 型号、主板型号,甚至可能是 GPU——但我会小心,因为 GPU 可以很容易地更换。
  • 您可以在添加哈希之前尝试检查接口的isVirtual 是否为假。这样你就应该把自己限制在机器的物理接口上。

标签: java encryption hardware key-generator


【解决方案1】:

您可以使用可信平台模块 (TPM),大多数较新的系统都已经提供了一个。请参阅This Library 了解访问 TPM 的简单方法。将您的唯一密钥存储在 TPM 上。

【讨论】:

  • 看起来很有趣也很有用。然而我不确定它是否能解决我所有的用例,因为我需要经常序列化加密的复杂对象。另外most newer systems 对我来说还不够。我不能保证我的用户系统..
猜你喜欢
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2012-11-02
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多