关于Java:Java-生成计算机专用的加密密钥

Java - generate machine specific encryption key

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

1
2
3
4
5
6
7
8
9
byte[] key = getConstKey();
Enumeration<NetworkInterface> inters = networkInterface.getNetworkInterfaces();
while (inters.hasMoreElements()) {
    NetworkInterface inter = inters.nextElement();
    if (inter.getHardwareAddress() == null) {
      continue;
    }
    hashKeyAccordingToAddress(key, inter.getHardwareAddress());
}

此方法运行良好并通过了所有测试,直到有一天我将笔记本电脑带出办公室...

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

有没有办法使它更健壮,例如仅使用趋于更稳定的特定NetworkInterface?还是有更好的方法来生成机器的唯一持久密钥?

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


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