【问题标题】:Ideas for a rudimentary software licensing implementation [closed]基本软件许可实施的想法[关闭]
【发布时间】:2011-01-30 14:50:52
【问题描述】:

我正在尝试决定如何为我编写的一些软件实施一个非常基本的许可解决方案。该软件将在我的(假设的)客户的机器上运行,其想法是如果客户端在多于 n 台机器上运行该软件(n 是他们的许可证数量),该软件将立即退出(并显示友好的消息)已购买)。此外,客户并不精通技术,以至于“基本”就足够了。

这是我目前的设计,但鉴于我对该主题几乎没有经验,我想在开始任何开发之前询问 SO:

  • 远程服务器托管 MySQL 数据库,其中包含两列的表:客户端密钥和许可证数量
  • 客户端应用程序在启动时连接到 MySQL 数据库,并提供我已放入打包到分发中的属性文件中的客户端密钥(我将为每个新客户端创建一个新分发)
  • 很有可能,我需要第二个表来存储验证历史记录,以便通过一些简短的逻辑,软件可以决定它是否可以在给定的机器上运行(可能是使用软件的 n 个机器的滑动窗口) 24 小时)
  • 如果软件无法建立与 MySQL 数据库的连接,或者认为它超过了每天允许的 n 台机器,则它会关闭
  • 托管 MySQL 数据库的远程服务器的连接信息应该硬编码到应用程序中吗? (这听起来是个坏主意,但否则他们可以将其指向其他始终验证成功的服务器)

我认为这涵盖了我最初的设计。目的是虽然它肯定不是完全证明的,但我认为我至少让创建一个易于共享的破解解决方案变得有些困难。此外,我可以轻松调整给定客户端/密钥对的许可数量。

我想这已经被做过一百万次了,所以告诉我一个更好的解决方案,它实施起来同样简单,并且提供相同(低)的安全性。如果使用外部库,我更喜欢 Java,因为这是编写软件的内容。

【问题讨论】:

    标签: java security licensing


    【解决方案1】:

    我在这里主要担心的是:(a) 如果客户端想要在未连接到 Internet 的情况下运行怎么办?好吧,也许您的应用程序天生就需要连接到 Internet 才能完成有意义的工作。但如果没有,您的一位客户是否可能希望在旅途中或其他一些无法连接互联网的情况下在笔记本电脑上运行该应用程序?或者,也许他们的联系目前刚刚中断。等等。

    (b) 如果您的验证服务器出现故障怎么办?当反盗版功能搞砸并阻止我在完全合法的情况下使用软件时,我感到非常恼火,而且我听到了许多其他人的类似投诉。

    另一方面,虽然创建一个需要某种“许可证密钥”才能运行的方案很容易,但要防止用户在两台机器上使用相同的许可证密钥就更难了。如果没有您描述的某种“许可证服务器”来监控它们,我不知道有什么方法可以控制已安装或正在运行的实例的数量。

    您认为盗版问题会有多大?您的应用程序是大多数客户可能只使用一两个副本,还是可能想要很多?如果是前者,那么所有额外的努力可能都不值得。如果是后者,那就另当别论了。

    我在一些商业产品上看到的一种技术是让客户在他们自己的本地网络中的一个机器上安装一个“许可证服务器”,然后这个服务器会加载一些许可证密钥,然后客户端对此进行验证。不需要聪明的黑客就能打败它——只需设置两个许可证服务器,复制密钥,并将一些客户端指向一个,另一个指向另一个——但它使诚实的用户能够遵守许可证限制,而无需担心网络中断。

    我曾经尝试过的一个想法是像你描述的那样设置一个验证服务器,但是如果连接尝试失败,我们会记录它并让它离开,并且只有在一段时间后才会阻止访问——我认为是一个星期——没有设法建立联系就过去了。这样一来,临时的互联网中断不会给用户带来不便。

    简短回答:您的想法应该可行,但有潜在的问题。

    【讨论】:

    • 该软件确实需要连接才能使用。我担心的是,当运行许可 MySQL db 的机器由于某种原因出现故障时会发生什么。我在想,与实施自己的许可带来的麻烦相比,盗版造成的潜在销售损失可能要小得多。
    • 另一个想法:盗版的可能性有多大?坦率地说,如果您正在销售视频游戏,那么客户很可能会为他们的朋友制作副本等。如果您的主要客户是大公司,他们通常不会冒着遇到法律问题的风险。为了在合法副本上节省几美元而被捕。
    【解决方案2】:

    我认为这可能不值得麻烦。客户可能不是那么精通技术,但如果值得他们花时间,他们会绕过它,如果不是,他们也不会使用你的软件。

    你不讨论配置过程——你怎么知道哪台机器包含 MySQL 数据库。你不讨论如果 MySQL 数据库出现故障会发生什么。

    坦率地说,第一次出现问题时,他们可能会发现要么他们不喜欢该软件而无法继续使用它,要么他们会想办法绕过该系统。即使最终用户不精通技术,他们也可能拥有内部技术支持。

    我不会在这上面浪费你的时间。如果您想要一个许可证管理系统 - 使用专业的。否则,请遵循信任和合理的法律条款。

    【讨论】:

    • 我认为您已经说服我强迫我们的项目在不许可或为第三方供应商的解决方案付费之间做出决定。感谢您的建议!
    【解决方案3】:

    我建议不要实施此类计划。如果您的客户端将遇到一些连接问题或您的 MySQL 数据库出现故障怎么办。您最终会遇到一些生气的客户。

    但是,如果您要实施这样的方案,这里有一些建议:

    1. 不要让您的密钥连续,要么生成随机密钥,要么执行类似 E(K,H(clientID + licenseID)) 的操作,其中 E 是加密函数,K 是某个密钥,H 是哈希函数。

    2. 如果您担心将应用程序指向某些始终验证的服务器,那么您假设它们足够精通技术。那么,什么会阻止他们使用其出站路由器上的 IPTABLES 之类的东西将所有到您的服务器的连接重新路由到同一个仅验证服务器,或者更改他们的 /etc/hosts 文件。硬编码静态 IP 假设您的服务器永远不会移动。如果您决定更改 ISP 怎么办。此外,即使您不是 ISP,有时也会出于各种原因重新编号他们的网络。

    3. 为避免 #2 中所述的问题,您必须实施某种质询响应系统。通过客户端将随机字符串与许可证数据一起发送到您的服务器,并使服务器使用一些已知密钥对其进行加密或散列。最好使用公钥方案。

    4. 如果您的服务器实际为您的程序执行一些计算,这些方案通常会起作用。选择不经常执行的东西,这样您的服务器就不会陷入困境。它也必须是不平凡的,所以破解者不会只是在假服务器中实现它。当然,它必须是必不可少的东西,没有它你的程序将无法运行。

    【讨论】:

    • 所有有效积分。我从这些答案中得到的总体想法是:除非我真的知道在许可解决方案方面我在做什么,否则不值得这样做;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2012-09-23
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多