【发布时间】:2012-08-28 05:09:55
【问题描述】:
我想生成一个硬件哈希,用于生成一个密钥来加密文件,这样它就不能与其他计算机交换。这不是许可证问题,它是从我们的在线数据库中存储一些数据的备份副本,以便可以离线使用该应用程序(但其中包含的数据相当安全,不会被窥探)。以前,我抓取了(真实)网络适配器的 MAC 地址,如下所示:
ManagementClass mng = new ManagementClass("Win32_NetworkAdapter");
ManagementObjectCollection apts = mng.GetInstances();
IEnumerable<string> macs = from ManagementObject mo in apts
where mo["MacAddress"] != null && mo["NetConnectionStatus"] != null
select mo["MacAddress"].ToString();
这工作得相当好,除了现在我发现我有一台新电脑,当我关闭无线时,我得到两个 MAC 地址(一个用于有线网卡,一个用于无线),当我打开无线时,我得到了三个(前两个,加上一个蓝牙!),我没有看到任何非常明显的方法来过滤掉蓝牙一个(没有在 NetConnectionID 中搜索“蓝牙”)。
现在我不需要超级稳定的哈希了。如果哈希不匹配,则应用程序无法解码加密数据,如果在网络上,它将下载一个新副本,所以这没什么大不了的(如果你不在网络上,它会只是告诉你它现在不可用)。但如果打开和关闭无线就足以改变我的哈希值,那么它显然不够稳定!
所以我的问题:
1) 有没有更好的方法来判断其中一个网络适配器可能会突然消失,以便我可以将其从原始哈希中排除?
2) 适配器的顺序是否保证相同?列出的第一个适配器总是有线网卡吗?如果是这样的话,也许我会限制它只使用第一个适配器。
3) 我可以使用更好、更稳定的哈希吗?还是相当稳定的组合?
注意:我也已经将 Environment.MachineName 中的机器名称添加到我的哈希中。
【问题讨论】:
-
生成一个随机数并将其存储在一个文件中。
-
那个mac地址没有任何实际意义,它所做的只是读取注册表。不稳定是烦人的,安全漏洞是不可接受的。使用公钥/私钥或其他值得实际编码的东西。
-
@HansPassant:但是移动这两个文件将允许它在不同的计算机上工作,这是我试图阻止的情况。
-
不同的计算机,该计算机上的不同用户?每台机器,每用户,无论是否为管理员,mac 欺骗。持续沟通,一劳永逸。在您尝试不这样做的时间里,您本可以查找如何正确执行此操作。
-
@TonyHopkinson:它符合我的要求。我对你所做的特定场景了解得更多,所以你要不要下马,或者给我一些有用的指导,而不是仅仅告诉我?