代码之家  ›  专栏  ›  技术社区  ›  massimogentilini

请评论这个简单的软件保护模式

  •  2
  • massimogentilini  · 技术社区  · 16 年前

    我被要求为我们的产品实现一个许可模式。它们是非常昂贵的产品,很少有客户分散在世界各地,基本上每个客户都有一个设计环境(安装在单个Windows计算机上的Windows应用程序,每个客户有1到150台客户机)和一个承载生产环境的Web服务器(每个客户有1到8台机器)。我们的产品已获得服务器使用许可,因此客户可以使用任意数量的客户机;我们决定不许可服务器部分(因为它受SLA协议的约束),而只许可客户机,因为在一段时间后,如果没有使用客户机的能力,系统将变得基本无用。

    我们的基本假设是,客户“足够诚实”,而且我们唯一想涉及的是,如果没有获得有效期许可证的适当许可,则停止客户设计环境。

    我评估过不同的许可产品,它们要么太贵,要么太难管理,所以我提出了一个简单的解决方案:

    • 许可证将是一个简单的签名XML文件,使用W3C的标准XML签名功能进行签名,使用一个将在USB密钥上提供给管理部门的私钥;如果它们丢失了副本,则许可模式将失败,但这将是它们的错误。
    • 客户端将在启动时打开许可证文件,并使用二进制文件中嵌入的公钥检查其有效性。
    • 如果许可证XML有效并且其中的数据(到期日期和产品名称)比设计器的工作正确,则将显示适当的消息。

    对可能出现的问题或如何改进方案有什么想法吗?

    4 回复  |  直到 16 年前
        1
  •  10
  •   Jacek Szymański    16 年前

    我还没有看到一个许可计划,如果有足够的兴趣,几个星期内没有被打破。你的计划看起来很好(尽管要确定如果有人真的想,他们会破坏它)。

    不管你做什么,你都应该跟着埃里克·辛克的 advice :

    目标应该是“保持 诚实的人诚实的”。如果我们去 除此之外,只有两件事 发生:

    1. 我们打不赢的仗。想作弊的人会成功的。
    2. 我们让我们的产品更难 使用。

    由于您正在为一个专为公司使用而设计的程序实施许可证方案,因此您可以更简单地在客户机上保留某种ID和到期日期以及一个简单的签名,并在许可证过期或签名失败时拒绝启动。打破它并不难,但没有许可计划,如果你认为你的客户诚实,这就足够了。

        2
  •  1
  •   Simon    16 年前

    你的问题并不完全清楚你的计划是如何运作的。客户端软件的每个实例都有不同的密钥吗?许可证有效期是多久?每个客户都有不同的钥匙吗?许可证是如何支付的?如何更新许可证?

    如果您试图控制客户机代码的使用数量,那么只有上面的第一个代码可以做到这一点。

    一天结束的时候,在这个你似乎居住的世界里,我怀疑你将不得不相信没有公然侵犯你的执照。大多数正派的组织(听起来像你的客户)都有责任不侵权,如果他们违反许可协议,可能会导致严重后果。他们也会定期对其进行审计,您可能有一些法定权利去检查他们的使用情况(如果没有,您应该将其写入您的许可协议)。

    如果USB钥匙的内容进入网络,对您来说会变得非常危险。在这方面,任何使用已发布密钥的方案都容易受到故意泄露机密的攻击。

    我敢肯定这方面有很多文献,所以很可能值得你继续研究。

    顺便说一句,我不确定您在中间部分对SLA的引用是否与您的服务器许可有关。许可证和SLA非常不同。许可证是客户的义务,SLA是您的。

        3
  •  1
  •   Steven A. Lowe    16 年前

    如果您给了他们私钥,那么是什么阻止他们创建更多的签名XML文件而不是从您那里购买额外的许可证呢?还是网站许可证?如果是后者,如何阻止他们为其他人/站点创建许可证?

    一般来说,开发许可方案使用MAC地址和/或硬盘驱动器序列号将许可证绑定到特定的机器,或者有时仅使用激活密钥(通常只是硬件信息的散列)。

    通常,编码是用您保密的私钥完成的,许可证是用公钥验证的;客户机永远没有私钥,否则,如果愿意,他们可以生成自己的许可证。

        4
  •  1
  •   Osama Al-Maadeed    16 年前

    我同意史蒂文A.洛的观点(我没有15个名声,所以我不能投票给他)。

    这似乎也太复杂了。你想让它牢不可破吗?你不可能。任何有足够动力的大师都会找到一种解决方法。

    有时简单的许可方案最有效:

    我建议管理员将一个简单的加密文件放在客户机可以访问的地方-它将包含客户机名称和到期日期。在所有打印的报告中使用文件中的客户机名称(这是最重要的 PHBs 注意,这样他们就不会使用打印别人名字的许可证了。