【问题标题】:Is there a unique computer identifier that can be used reliably even in a virtual machine?是否有一个唯一的计算机标识符,即使在虚拟机中也可以可靠地使用?
【发布时间】:2011-06-03 10:21:00
【问题描述】:

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

我知道没有任何方法可以使其 100% 安全,但我想让大多数高级用户难以做到这一点。

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

关于我应该研究什么以使其最安全的任何想法。我没有时间也没有必要让它尽可能安全,因为它会破坏应用程序本身的目的。

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

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

另外,与其尝试识别机器,不如识别用户并创建通过 AD 处理的基于组的权限以访问该软件。

【问题讨论】:

  • 即使在VM中MAC地址也应该是唯一的? - stackoverflow.com/questions/3443093/…
  • 每个人都如何获得如此精确的数据,以了解可以欺骗 MAC 地址的人数?显然是 5%……我不知道。
  • 我不想做MAC地址,任何可以google的高级用户都可以欺骗它。 mydigitallife.info/2008/06/30/…
  • 我相信只有不到 1% 的人会解决这个问题。

标签: c# .net security macos vmware


【解决方案1】:

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

【讨论】:

  • mydigitallife.info/2008/06/30/… 我认为超过 5% 的人很容易做到这一点。
  • 根据最近的统计数据,美国的计算机素养为 20%。我想不到四分之一的人可以欺骗 MAC 地址。我只是重新措辞你的问题。
【解决方案2】:

最简单的解决方案是使用mac地址,但注意在Windows上editing the registry很容易改变它。我想说只有不到 5% 的人知道如何做到这一点。

C#中获取mac地址的方法如下:

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

【讨论】:

  • 在 Windows 中没有人可以做到这一点,这就是问题似乎所暗示的。 ;-)
  • 我指的是 ifconfig 的使用,您现在已将其从答案中删除。我知道MAC可以在任何操作环境下被欺骗。
  • @Cody 我最初假设是 Linux(是的,我没有阅读标签,我很淘气!:P)但改变了它。问题并没有暗示任何关于mac地址的内容,它甚至没有提到它。
【解决方案3】:

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

当然,更换网卡会导致您的软件无法运行。

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

【讨论】:

    【解决方案4】:

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

    当然,这种方法并非没有缺陷。这篇文章中还列出了其他方法,它们类似,但不完全相同:What's a good way to uniquely identify a computer?

    【讨论】:

    • 注意,我认为我链接到的 StackOverflow 帖子中的答案值得点赞。公认的答案非常好,特别是要小心它是一项持续的琐事。
    【解决方案5】:

    扩展 macaddress 方法。您可以使用带有 md5 函数的 macaddress 以及只有系统所有者知道的 SALT。这样一来,不知道SALT,macaddress就没有用了。

    只是我的 tuppence 值.. :)

    [编辑] - 另见此处有关散列/加盐等的 c# 示例:

    MD5 hash with salt for keeping password in DB in C#

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

    【讨论】:

      【解决方案6】:

      根据设计,唯一标识虚拟机是很困难的;任何能让您唯一识别它的东西都意味着它不是完​​全虚拟的(因为克隆虚拟机应该会产生相同的机器)。

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

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

      不可能 100% 保护终端程序。这个问题相当于试图防止软件盗版。

      【讨论】:

        【解决方案7】:

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

        VM 中可用的 SMBIOS UUID 也被 VMware 管理程序和管理工具用作 VirtualMachine.config.uuid(请参阅:the uuid property on this page)。这意味着它保证在特定主机或特定 vCenter 中是唯一的。但是,它可以在不同的主机或不同的 vCenter 安装上复制。

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

        这可能接近您的 95% 大关,因为要准确复制虚拟机需要一些特殊的努力和设置。

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

        我建议使用您提到的基于权限的方法,如果需要,甚至可以使用并发许可服务器。但我来自高度虚拟化的背景,与硬件相关的许可证已经令人头疼。

        【讨论】:

          猜你喜欢
          • 2010-09-08
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 2016-09-09
          • 2012-04-06
          • 2012-09-27
          • 2023-03-11
          相关资源
          最近更新 更多