0

我正在编写一个将加密对象映射序列化到文件的类,以维护用户登录数据等。
这个想法是能够始终在同一台机器上使用此类恢复和解密数据,但不能在同一台机器上其他机器。
为此目的(如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());
}

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

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

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

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

4

1 回答 1

2

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

于 2015-12-10T13:13:17.433 回答