问题 是否有唯一的计算机标识符,即使在虚拟机中也可以可靠地使用?


我正在编写一个小型客户端程序,以便在终端服务器上运行。我正在寻找一种方法来确保它只能在指定的服务器上运行,如果它从服务器中删除它将停止运行。

我知道没有办法让它100%安全,但我想让大多数高级用户都难以做到这一点。

我正在查看不同的唯一标识符,如处理器ID,Windows产品ID,计算机GUID和其他UI。因为终端服务器是虚拟机,所以我无法找到任何完全独特的机器。

关于我应该考虑什么的任何想法,使这大多是安全的。我没有时间或者没有必要让它尽可能安全,因为它会破坏应用程序本身的目的。

我不想用户MAC地址。尽管每台机器都是独一无二的,但它可以通过互联网上的说明进行欺骗。

至于Microsoft产品ID,因为我们的系统团队克隆了VM服务器并且我们使用公司卷密钥,所以我发现已经有两个我有权访问的服务器具有相同的产品ID号。我不知道有多少其他人拥有相同的产品ID

或者,我可能会通过识别用户并创建通过AD处理的基于组的权限来访问此软件,而不是尝试识别机器。


2488
2018-01-04 14:11


起源

即使在虚拟机中,MAC地址也应该是唯一的? - stackoverflow.com/questions/3443093/... - Paolo
每个人如何拥有可以欺骗MAC地址的人数的精确数据?显然这是5%......我不知道。 - Cody Gray♦
我不想做MAC地址,任何可以google的poweruser都可以欺骗它。 mydigitallife.info/2008/06/30/...
我非常有信心不到1%的人会这样做。 - marcog


答案:


通过设计,难以唯一地识别虚拟机;任何允许您唯一标识它的东西都意味着它不是完​​全虚拟的(因为克隆虚拟机应该生成相同的机器)。

  1. 在主机上创建心跳应用程序,通过环回网络适配器与VM通信。
  2. 如果心跳应用程序无法唯一标识主机,则拒绝运行该应用程序。
  3. 如果心跳应用程序未运行,主应用程序是否拒绝运行。

您需要找到一种方法来确保心跳应用程序不会太容易被欺骗。

无法100%保护终端程序。这个问题相当于试图阻止软件盗版。


5
2018-01-04 19:49





我发现的最好的东西是BIOS UUID - 但它远非完美的用例。

VM内部可用的SMBIOS UUID也被VMware虚拟机管理程序和管理工具用作VirtualMachine.config.uuid(请参阅: 此页面上的uuid属性)。这意味着它可以保证在特定主机或特定vCenter中是唯一的。但是,它可以在单独的主机或单独的vCenter安装上复制。

此外,虚拟机上的BIOS UUID是可变的。它可以通过API进行更改(虽然不容易通过客户端)。

这可能接近你的95%标记,因为需要一些特殊的努力和设置才能完全复制VM。

但是,从虚拟化支持的角度来看(包括VM灾难恢复和虚拟化软件的未来升级):使用UUID或MAC地址等硬件ID会导致各种问题。当他们想要通过创建新虚拟机来修改软件下的操作系统版本时,他们需要手动编辑两个服务器的VM配置以更改UUID以匹配。使用MAC,如果他们更改了网络架构,则您的软件需要将VM作为一种特殊情况。这些事情只会给虚拟管理员带来麻烦(但它们可能是您试图引起的确切问题 - 只有您确切知道)。

我建议使用您提到的基于权限的方法,如果需要,甚至可以使用并发许可服务器。但我来自一个虚拟化的背景,硬件绑定的许可证已经成为头疼的问题。


2
2018-01-06 15:35





您可以将许可证绑定到网卡的MAC地址(或卡,如果有多个)。

当然,更换网卡会阻止您的软件运行。

如果/当 TPM 在服务器上成为标准,您应该能够使用它来验证服务器。


1
2018-01-04 14:16





您可以获取PC的MAC地址,如下所示: http://www.java2s.com/Code/CSharp/Network/GetMacAddress.htm

当然,这种方法并非没有缺陷。此帖中列出了其他方法,它们类似,但不完全相同: 什么是唯一识别计算机的好方法?


1
2018-01-04 14:17



注意,我认为我链接的StackOverflow帖子中的答案值得一些赞成。接受的答案是非常好的,特别是关于它是一项持续的苦差事的谨慎。 - David


最简单的解决方案是使用mac地址,但请注意,它可以在Windows上轻松更改 编辑注册表。我会说不到5%的人知道如何做到这一点。

以下是如何在C#中获取mac地址:

System.Net.NetworkInformation.NetworkInterface.GetPhysicalAddress();

1
2018-01-04 14:16



在Windows中没有人可以做到这一点,这就是问题似乎意味着什么。 ;-) - Cody Gray♦
@Cody你有多错! - marcog
我指的是使用 ifconfig,你现在已经从你的答案中删除了。我知道MAC可以在任何操作环境下进行欺骗。 - Cody Gray♦
@Cody我最初假设Linux(是的,我没有阅读标签,顽皮我!:P)但改变了它。问题并不意味着有关mac地址的任何内容,它甚至没有提到它。 - marcog


扩展macaddress方法。你可以使用带有md5函数的macaddress和a  只有系统所有者知道。这样,macaddress在不知道的情况下是无用的

只是我的tuppence值得.. :)

[编辑] - 另请参阅此处有关散列/腌制等的c#示例:

带有salt的MD5哈希,用于在C#中保存密码

http://www.obviex.com/samples/hash.aspx


1
2018-01-04 17:53





如果你想要95%,我会选择 Mac ID  - 它可以是欺骗性的,但默认情况下对于机器来说是唯一的。


0
2018-01-04 14:16



mydigitallife.info/2008/06/30/...  我认为超过5%的人会做到这一点。
根据最近的统计数据,美国的计算机知识率为20%。我想,不到四分之一的人可以欺骗MAC地址。我只是重新提出你的问题。 - BrokenGlass