我有一个应用程序——用 C# 编写——只有一个用户使用。我提供这个软件的月费很高(> 10,000 美元)。我想保护此应用程序不被任何其他用户使用,并且如果他们停止支付许可费,我希望能够阻止一个用户使用该应用程序。
我知道没有完美的保护方案,并且我已经查看了许多关于 SO 的类似问题,但我的问题有点不同,因为我只有一个客户端,我可以完全访问他们的硬件,我不介意每次安装甚至需要几个小时才能显着提高安全性。
我有一个应用程序——用 C# 编写——只有一个用户使用。我提供这个软件的月费很高(> 10,000 美元)。我想保护此应用程序不被任何其他用户使用,并且如果他们停止支付许可费,我希望能够阻止一个用户使用该应用程序。
我知道没有完美的保护方案,并且我已经查看了许多关于 SO 的类似问题,但我的问题有点不同,因为我只有一个客户端,我可以完全访问他们的硬件,我不介意每次安装甚至需要几个小时才能显着提高安全性。
最好的解决方案可能是当今使用的流行策略的组合:
…到主机操作系统的 MAC 地址、硬盘序列号和 Windows 产品密钥(如果有)。您可以在站点收集后将其硬编码到应用程序中。如果检测到错误的硬件,则将其关闭。此外,在注册表中查找表明存在 VMware 或 Virtual PC 集成功能并在找到时拒绝运行的项目。
…因此,逆向工程和删除您的许可将更加困难。CIL 非常容易进行逆向工程,因此无论您做什么,这都应该是您的应用程序(如所述)的重点。这可能需要很长时间才能正确处理,尤其是在您依赖序列化的情况下。如果可能,将所有程序集包装到一个 EXE 文件中,该文件已加密并具有非托管引导程序。
…到带有硬件或站点特定数据的异地服务器。如果该软件被复制并在另一台计算机上启动,您可能会得到提示。如果应用程序脱机,这也有可能提醒您。此外,您可以将应用程序配置为需要来自服务器的基本加密响应或关闭。
最后一点:不要过火。据推测,由于您的应用程序在可能的替代方案(无论是什么)方面的经验,您将获得 10,000 美元的报酬。当您添加保护措施时,您会增加可能的(非常烦人的)错误的数量,增加维护成本,并让您的客户感到头疼。一个极具破坏性的许可计划可能会让您的客户产生不同的想法。
真正保护您的代码并确保您可以对其收费的唯一方法是制作一个基于订阅的 Web 应用程序。除此之外,有几个选项可能有效:
旁注:该死,我需要找到一个每月支付 1 万美元购买软件包的客户!哈哈。
安全是一个过程。
我质疑为什么有人每月为申请支付 10k 的原因。复制此应用程序的功能可能不会花费那么高的成本。那么如果使用它的实体向另一个程序员描述它,他们可以复制它吗?大概。
无论如何,如果您可以访问他们的硬件并控制他们的操作系统用户名/密码,只需让密码每月到期即可。
我将假设一个 Windows 平台(即不是 Mono)。
您可能想查看在安装软件的机器上生成和安装证书。这意味着您的软件可以检查机器是否被授权运行您的软件,并且您还可以使用证书来加密和解密内容。IOW 您可以考虑加密您的程序集,然后在动态加载它们之前对其进行解密,或者您可以对您提供的任何数据使用加密/解密。
此链接可能是您检查此内容的良好开端。
这听起来像是硬件加密狗可能适合的情况。花钱请人创建一个硬件加密狗(听起来你买得起!)并将一个发送给客户。构建您的软件,以便用户必须输入密码才能解锁软件需要运行的加密狗上的加密内容。
认证一般至少基于用户情况的两个方面:
如果您想同时使用这三个,请将您的硬件加密狗与指纹读取器结合使用。
您可以将您的应用程序绑定到该框。您还可以通过向用户提供登录名来限制对用户的使用。我看不出您可以对您的用户与其他人共享他的凭据和盒子做些什么。
如果绑定到一个盒子就足够了,那么有一些技术可以做到这一点 - 即您可以将它绑定到 NIC 硬件 ID。
过去,我在应用程序启动时使用了“电话回家”身份验证,以确保它只有在您的服务器给予身份验证时才能运行。
当然,这要求您可以在身份验证服务器上提供非常高的可用性,并且具有良好的混淆代码库,但它工作得非常好。
查看文章为软件保护和许可而开发;它解释了如何选择一个解决方案,为什么你应该混淆你的应用程序,并提供了一些让你的代码更难破解的技巧。
这篇文章的主旨是,您应该从一开始就考虑这些事情,但解决它们永远不会太晚。
要记住的是,一旦您的应用程序在另一台机器上运行,就没有 100% 保证的方法来阻止执行。如果你小心的话,你能做的就是把门槛提高到足够高,以至于购买你的软件比破解它更容易。
强制性免责声明和插件:我共同创立的公司为 .NET 生产 OffByZero Cobalt 软件许可解决方案。