我正在编写一个类,它将加密对象的映射序列化为文件,以便维护用户登录数据等。
我们的想法是能够始终在同一台机器上使用此类恢复和解密数据,但不能在其他机器上恢复和解密数据
为此目的(如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
?或者有更好的方法来生成机器唯一持久密钥吗?
更新:更具体地说,当我从办公室外部连接到VPN服务时,问题就开始了。由于某些登录详细信息用于通过此VPN连接到服务,因此我的解决方案变得毫无用处。