我正在编写一个在终端服务器上运行的小型客户端程序。我正在寻找一种方法来确保它只能在指定的服务器上运行,如果它从服务器中删除它将停止运行。
我知道没有办法让它100%安全,但我想让大多数高级用户都难以做到这一点。
我正在查看不同的唯一标识符,如处理器ID,Windows产品ID,计算机GUID和其他UI。由于终端服务器是虚拟机,因此无法找到任何完全独特的机器。
关于我应该考虑什么的任何想法,以使这大多安全。我没有时间或者没有必要让它尽可能安全,因为它会破坏应用程序本身的目的。
我不想用户MAC地址。即使每台机器都是独一无二的,也可以按照互联网上的说明进行欺骗。
就Microsoft产品ID而言,由于我们的系统团队克隆了VM服务器并且我们使用公司卷密钥,因此我发现已经有两个我有权访问的服务器具有相同的产品ID号。我不知道有多少其他产品具有相同的产品ID
或者,不是尝试识别机器,而是通过识别用户并创建通过AD处理的基于组的权限来访问此软件,我可能会更好。
答案 0 :(得分:6)
通过设计,难以唯一地识别虚拟机;任何允许你唯一识别它的东西都意味着它不是完全虚拟的(因为克隆虚拟机应该生成一台相同的机器)。
您需要找到一种方法来确保心跳应用程序不会太容易被欺骗。
无法100%保护终端程序。这个问题相当于试图阻止软件盗版。
答案 1 :(得分:2)
我发现的最好的东西是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作为一种特殊情况。这些事情只会给虚拟管理员带来麻烦(但它们可能是您试图引起的确切问题 - 只有您肯定知道)。
我建议您使用您提到的基于权限的方法,或者甚至是必要时使用并发许可服务器。但我来自一个虚拟化的背景,硬件绑定的许可证已经成为头疼的问题。
答案 2 :(得分:1)
最简单的解决方案是使用mac地址,但请注意,editing the registry可以在Windows上轻松更改它。我会说不到5%的人知道怎么做。
以下是如何在C#中获取mac地址:
System.Net.NetworkInformation.NetworkInterface.GetPhysicalAddress();
答案 3 :(得分:1)
答案 4 :(得分:1)
您可以获取PC的MAC地址,如下所示:http://www.java2s.com/Code/CSharp/Network/GetMacAddress.htm
当然,这种方法并非没有缺陷。此帖中列出了其他类似的方法,但不完全相同:What's a good way to uniquely identify a computer?
答案 5 :(得分:1)
扩展macaddress方法。您可以使用带有md5函数的macaddress,并使用仅为系统所有者所知的SALT。这样,macaddress在不知道SALT的情况下毫无用处。
只是我值得一试......:)
[edit] - 另请参阅此处有关哈希/盐化等的c#示例:
答案 6 :(得分:0)
如果您想要95%我会使用Mac ID - 它可以被欺骗,但默认情况下该机器是唯一的。