我正在编写一个小型客户端程序,以便在终端服务器上运行。我正在寻找一种方法来确保它只能在指定的服务器上运行,如果它从服务器中删除它将停止运行。
我知道没有办法让它100%安全,但我想让大多数高级用户都难以做到这一点。
我正在查看不同的唯一标识符,如处理器ID,Windows产品ID,计算机GUID和其他UI。因为终端服务器是虚拟机,所以我无法找到任何完全独特的机器。
关于我应该考虑什么的任何想法,使这大多是安全的。我没有时间或者没有必要让它尽可能安全,因为它会破坏应用程序本身的目的。
我不想用户MAC地址。尽管每台机器都是独一无二的,但它可以通过互联网上的说明进行欺骗。
至于Microsoft产品ID,因为我们的系统团队克隆了VM服务器并且我们使用公司卷密钥,所以我发现已经有两个我有权访问的服务器具有相同的产品ID号。我不知道有多少其他人拥有相同的产品ID
或者,我可能会通过识别用户并创建通过AD处理的基于组的权限来访问此软件,而不是尝试识别机器。
通过设计,难以唯一地识别虚拟机;任何允许您唯一标识它的东西都意味着它不是完全虚拟的(因为克隆虚拟机应该生成相同的机器)。
- 在主机上创建心跳应用程序,通过环回网络适配器与VM通信。
- 如果心跳应用程序无法唯一标识主机,则拒绝运行该应用程序。
- 如果心跳应用程序未运行,主应用程序是否拒绝运行。
您需要找到一种方法来确保心跳应用程序不会太容易被欺骗。
无法100%保护终端程序。这个问题相当于试图阻止软件盗版。
我发现的最好的东西是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作为一种特殊情况。这些事情只会给虚拟管理员带来麻烦(但它们可能是您试图引起的确切问题 - 只有您确切知道)。
我建议使用您提到的基于权限的方法,如果需要,甚至可以使用并发许可服务器。但我来自一个虚拟化的背景,硬件绑定的许可证已经成为头疼的问题。
您可以将许可证绑定到网卡的MAC地址(或卡,如果有多个)。
当然,更换网卡会阻止您的软件运行。
如果/当 TPM 在服务器上成为标准,您应该能够使用它来验证服务器。
最简单的解决方案是使用mac地址,但请注意,它可以在Windows上轻松更改 编辑注册表。我会说不到5%的人知道如何做到这一点。
以下是如何在C#中获取mac地址:
System.Net.NetworkInformation.NetworkInterface.GetPhysicalAddress();
扩展macaddress方法。你可以使用带有md5函数的macaddress和a 盐 只有系统所有者知道。这样,macaddress在不知道的情况下是无用的 盐。
只是我的tuppence值得.. :)
[编辑] - 另请参阅此处有关散列/腌制等的c#示例:
带有salt的MD5哈希,用于在C#中保存密码
http://www.obviex.com/samples/hash.aspx
如果你想要95%,我会选择 Mac ID - 它可以是欺骗性的,但默认情况下对于机器来说是唯一的。