Java-生成特定于机器的加密密钥

Java-生成特定于机器的加密密钥,java,encryption,hardware,key-generator,Java,Encryption,Hardware,Key Generator,我正在编写一个类,它将加密对象的映射序列化到一个文件,以便维护用户登录数据等。 其思想是能够始终在同一台机器上使用此类恢复和解密数据,但不能在其他机器上恢复和解密数据。 为此(如和其他文章中所建议的),我迭代网络接口的硬件地址,同时使用它们散列默认常量键: byte[] key = getConstKey(); Enumeration<NetworkInterface> inters = networkInterface.getNetworkInterfaces(); while (

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

byte[] key = getConstKey();
Enumeration<NetworkInterface> inters = networkInterface.getNetworkInterfaces();
while (inters.hasMoreElements()) {
    NetworkInterface inter = inters.nextElement();
    if (inter.getHardwareAddress() == null) {
      continue;
    }
    hashKeyAccordingToAddress(key, inter.getHardwareAddress());
}
byte[]key=getConstKey();
枚举inters=networkInterface.getNetworkInterfaces();
while(inters.hasMoreElements()){
NetworkInterface=inters.nextElement();
if(inter.getHardwareAddress()==null){
继续;
}
HashKeyAccordingLoadAddress(key,inter.getHardwareAddress());
}
这很好,通过了我所有的测试,直到有一天我把笔记本电脑带出办公室

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

有没有一种方法可以使它更健壮,比如只使用更稳定的特定
NetworkInterface
s?还是有更好的方法来生成机器唯一的持久密钥


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

您可以使用受信任的平台模块(TPM),大多数较新的系统都有一个可用的模块。有关访问TPM的简单方法,请参阅。将您的唯一密钥存储在TPM上。

您可以使用硬件中几乎不会更改的信息,如HD序列号、主板序列号……java是否利用这些信息?我能得到的唯一硬件信息是inet addresses.AFAIK没有直接从java执行此操作的API,您必须调用OS命令才能执行此操作。例如,在Windows中,您可以使用WMI调用,如:
wmic diskdrive get serialnumber
wmic仅在WMI被激活、正在运行且具有相应信息的情况下工作-这通常是使用wmic的最差方法,另外:从网卡收集信息是一个非常糟糕的主意,因为网卡可以完全配置和/或甚至自行配置,这基本上意味着您的硬件数据可能随时发生变化。唯一稍微稳定的信息可能是CPU型号、主板型号,甚至可能是GPU——但我会小心,因为GPU可以很容易地交换。在添加哈希之前,您可以尝试检查接口的
isVirtual
是否为false。这样的话,你应该把自己限制在机器的物理接口上。看起来很有趣也很有用。但我不确定它能解决我所有的用例,因为我需要经常序列化加密的复杂对象。另外,
大多数较新的系统
对我来说还不够。我对我的用户系统没有任何保证。。