Web应用程序中的许可证密钥解决方案,最佳方法是什么?


14

我不满意经理的要求。我为一家小型初创公司工作,我们为一家规模较大的公司开发了具有固定价格和维护协议的Web应用程序。得知大型公司将如何支付账单的最后一刻的恐怖故事,我们决定,我们希望能够通过许可该Web应用程序来保护自己,这种方式如果我们无法获得付款,则该软件将不再起作用。

我之前已经看到桌面应用程序可以做到这一点,但是这将是一个Web应用程序,它们将在内部托管,并且不能从Internet访问。

这样做的最佳方法是什么,我们希望它的占用空间小,并希望能够续订他们已分发的许可证密钥。

有人做过类似的事情吗?我们会完全失去理智吗?有人有更好的建议吗?


要正确执行此操作,您将需要很多时间(否则,他们会打破它)。仅购买旨在保护Java程序的产品会便宜得多。否则,只需将许可证作为程序读取的Java字节代码片段,然后进行操作即可。

这就是我所担心的,我将研究第三方解决方案,但是我们已经痛苦地超支了。
maple_shaft

然后,在付款到期2周后,让它缓慢地缓慢运转。

@Thorbjørn,哈哈!^ _ ^诱人的是,该项目是试图与该公司开展更多业务的亏损领导者。最高质量至关重要。同时,我们不希望在寻找蜜罐时完全拧紧螺丝。
maple_shaft

@maple,听起来像是一个不好的商业计划。然后将收集的钱留给会计师,不要考虑分发恶意软件。

Answers:


9

有很多方法可以实现这样的事情,但是这不应该太难做:

您需要在某个公共站点上托管一个网站,该网站托管一个文件,该文件包含已列入黑名单的许可证密钥的哈希值。您如何管理此文件取决于您,但是文件本身仅需要每行有一个哈希即可。

然后,您的软件会定期重复下载此文件(大多数服务器端语言都提供了此文件),然后在其中搜索已安装许可证密钥的哈希值。如果找到了,则应用程序知道它应该死,直到删除黑名单。

MD5或类似的东西加上一个秘密就足够了。您可能会觉得更怪异,并希望应用程序将请求发送到您的站点,然后您可以在数据库中即时查找请求,但是文件(对于我来说,我希望它可能是一个简短的列表)可能希望很小,并且可能会最简单的方法。

最困难的部分将是使应用程序停止运行。毕竟,您必须将其存储在内部某个地方,这意味着,如果它太明显了,则可以轻松地对其进行颠覆;即使它不是太明显,也可以通过还原适当的表/来轻松地对其进行还原。文件。因此,我也建议采用第二种保护方法。

该方法将“ LIVE”或“ DEAD”(或足够类似的东西)存储在表或文件中,但又被哈希化。这需要与您的盐和时间戳进行哈希运算。每次运行应用程序上的页面时,请使用“ LIVE” + salt + timestamp的哈希版本检查此值,然后允许有效的时间戳范围(例如,一天,两天,一周,一个月等)。请记住,范围越大,性能越差。)只要事物匹配(或找到匹配),该应用程序就处于活动状态;否则,即使特殊文件或表中的值为“ LIVE”,如果尝试从备份还原,则该时间戳仍将失效,因为时间戳将超出阈值。

总而言之(这确实假定您具有某种检查许可证密钥有效性的程序化方法,例如某种校验和或其他方法):

  • 黑名单
    • 将许可证密钥转换为带有盐的哈希
    • 从服务器请求黑名单文件
    • 我的哈希在文件中吗?
    • 如果是,则存储“ DEAD” +盐+时间戳的哈希(截断为天;无需存储小时+天+分钟)
    • 如果为“否”,则存储“ LIVE” +盐+时间戳的哈希(被截断)
  • IsKeyAlive
    • 从“实时” +盐+截断的时间戳创建哈希
    • 加载DeadAlive哈希
    • 他们同意吗?
    • 如果是,那么我们还活着;返回TRUE。
    • 如果为“否”,那么我们可能已经死了,但仍可能在时间戳窗口内:
      • 从时间戳中减去一天并重复哈希。
      • 我们现在同意吗?
      • 是?返回TRUE
      • 向时间戳记添加一天并重复哈希
      • 我们现在同意吗?
      • 是?返回TRUE
    • 此时,我们超出了时间戳范围,没有匹配项。返回FALSE。(杀死应用)

现在,天哪知道可能有一百万个失败的方法。考虑所有可能的方法并构建一个可靠的系统(包括一个如果无法下载黑名单文件则假定客户端正确的系统)。在部署之前进行测试,测试,测试,然后再进行其他测试,因为如果出现问题,您将失去客户的信任。


+1对于一个复杂的答案O_o。我可能是错的,但我认为这并不需要这么复杂。我不是在分发Microsoft Office,而是为单个客户端定制的应用程序。同样的问题仍然存在,托管此应用程序的服务器可能无法与外部服务进行通信。我不明白为什么在这里真正需要加密,哈希和盐。我们真正想要的实际上是一个终止开关。
maple_shaft

谢谢;-)我建议使用哈希的原因是,这样一来,嗅探流量和/或在您的客户端上查看代码/表/文件的人都无法知道到底发生了什么。如果没有双方参与,哈希就毫无意义,并且客户端不太可能理解哈希实际上是其许可证密钥的表示。(如果是明文传输的话,他们马上就会知道的。)同样,它减少了对黑名单文件进行任何加密或SSL的需要-哈希本身就意味着zip。
Kerri Shotts

旁注:如果您相信客户端会认为还原某些表/文件太困难,则可以通过在每次运行该应用程序时都删除该检查,从而大大降低复杂性。就是说,不需要花太长时间就能弄清楚发生了什么并想出解决办法。
Kerri Shotts

1
CheckBlacklist:license-server.example.com: no route to host现在呢?许可证服务器甚至可能在将来的某个时候不存在 -并且不要告诉我您的公司在20年后仍然存在,这在统计上是不可能的。
Piskvor在2011年

1
有很多方法可以解决此问题,包括不使用自己的服务器。使用亚马逊或谷歌或类似的东西。或者,对支票建立“信任”,以便如果主机已死,用户可以继续使用该应用程序。正如我在文章中提到的,它有百万种失败的方式,这就是为什么我反对这种检查的原因。我宁愿相信我的客户,也不愿提出这种支票。(我会自己寻求许可证密钥。但是将其列入黑名单?IMO不值得付出努力。)
Kerri Shotts

4

其他答案已经很好地涵盖了技术方面。但也请考虑法律方面。

如果他们不付款,您甚至有权阻止他们的应用程序?如果您未在合同中提前提及此内容,即使付款失败(例如您不一定有权收回所售商品),您也可能无权这样做。同样,许多国家/地区都有禁止“操纵计算机程序”的特殊法律-您所做的事情可能被视为是这样,甚至可能使您承担刑事责任。

因此,我建议您首先与律师进行讨论,以免陷入困境。

最后,仅依靠法律制度可能会更好。如果他们不付款,请进行谈判,如果这样做没有帮助,请提起诉讼。在许多国家/地区,如果合同情况明确,起诉相对容易且成本低廉(例如,在德国,您可以以不到20欧元的价格获得Mahnbescheid)。


这种联系可以回答我关于我们是否疯了的问题。尽管我别无选择,但给我留下了明显的印象,这是我的上级坚持要执行的,即使它不在合同中。不幸的是,我在美国生活和工作,即使你是对的,你也无法成立一家大公司。他们拥有众多的律师,如果他们真的愿意的话,他们会将所有东西埋在文书工作中足够长的时间,使我们破产。
maple_shaft

我同意@sleske使用合法渠道。确保合同是正确的,如果违反条款,则提起诉讼。或至少威胁要提起诉讼。就我所看到的大公司而言,他们非常愿意向供应商付款,以避免被起诉或违反合同。
RationalGeek

@maple_shaft:对美国的法律状况一无所知,但我希望法律状况不会像您描绘的那样绝望。无论如何,如果您被告知要实现这一点,我只是指出了潜在的问题。如果您仍然可以通过(当然是书面形式),您将尽一切可能。
sleske 2011年

有时间限制的许可系统不会有问题,一旦许可到期,该应用程序将一无是处。大小不一的公司很多,例如Adobe。
詹姆斯·斯内尔

2

如果他们在内部托管,这与您可能会附带的其他软件有何不同?弄清楚如果要运送桌面清单显示应用程序该怎么办,然后执行此操作。


我想我只是对一般情况感到困惑。我想象该应用程序应该通过将请求发送给具有许可证号的外部Web服务器来每晚检查其许可证密钥。响应将是成功或失败,并将存储在应用程序上下文级别变量中。如果许可证密钥无效,则该应用程序实质上将“关闭”。这样,如果需要,我们可以简单地使该许可证号“无效”。
maple_shaft

您是否认为此简单的许可证认证页面应进行SSL加密?即使有人实施数据包嗅探器并可以获取有效的许可证号,他们也需要具有应用程序的分布式副本,这样它才有用,即使如此,它也是非常有目的的。除了我的直接客户,我无法想象这对其他人有用。
maple_shaft

1

这取决于系统。您是否扩展了像Magneto这样的现有框架,还是从头开始编写了整个应用程序?如果是较晚的版本,那么建立许可要求就不会太困难。您只需提供带有短期许可证的应用程序,该许可证在您开具账单后的45天后过期,然后在以后提供永久许可证。

这假定您也没有移交源。:)


我们没有移交消息来源。我们将控制源代码,并在需要时分发常规版本和错误修复。
maple_shaft

1
@maple_shaft:嗯,总有一种可能性,就是在付款之前一直拒绝发布任何修复程序或更新,因为我怀疑维护是内置的,无论是初次购买还是作为持续的东西出售,并带有定期付款日期(通常但并非总是每年一次)。
Vatine 2011年

为了跟进@Vatine,对于以前缺乏强大许可的项目,我们将缺陷用作提取付款的杠杆点。有些缺陷可能不是完全的事故。
Christopher Bibbs

@maple_shaft-如果您只有一个客户。解决方案很简单。除非余额为$ 0,否则请勿提供该程序的更新。
拉姆猎犬,2011年

1

由于系统是内部托管的,因此上述涉及与远程服务器通信的许多解决方案可能无法正常工作。

为什么不改为在包含到期日期的项目中添加许可证文件。一旦系统时钟超过有效日期,系统就会停止运行。要保护文件,请加密内容以防止篡改。当用户确实付款或续订一年时,您可以向他们发送新的许可证文件。

请注意,如果您使用的是PHP,则用户可以随时使用该代码进行编辑,因此,无论您采用哪种安全性,用户都可以轻松地将其删除。如果您使用的是ASP.NET或其他某种编译语言,则不必担心,因为无法修改代码。


这是一个很好的建议,但这是一个打包并部署的Java应用程序。给他们一个新的许可证文件意味着信任他们将其正确地插入WAR文件中,或者给他们一个全新的WAR文件,这对于每个人来说都是令人讨厌的。他们有大量的文书工作,而且有多个IT人员,只要有新版本的第三方应用程序参与,就需要参与其中以证明其存在的合理性。我不会轻视您的建议,只是说这可能是最不令人反感的建议。
maple_shaft

我想即使使用Java之类的大多数已编译语言,罐子也可以轻松地反编译,更新,重新编译然后包含在战争中,那么如何处理呢?
Sudarshan 2013年

1

(公开-我为许可证管理器系统提供商Agilis Software工作)。

最有效的解决方案是将自动产品激活与许可证租赁一起使用。开箱即用,您可以:

  • 自动激活客户的许可证。在激活时,每个实例都会自动锁定到您选择的目标系统参数,并且您为它们设置的许可证限制将在您的应用程序上强制执行(例如,配置功能,设置总体试用或订阅时间限制)。
  • 设置一个“租赁间隔”,这是任何一个激活事件的最大有效期。对于拥有可疑信用的客户,您可以将其设置为两周,这意味着您的应用每两周会在后台自动“回电”以重新许可。如果他们逾期未付款,则可以在托管服务器中禁用其许可证,它将在下一个电话回家中停止运行。
  • 如果没有来自目标系统的网络连接,则可以通过在任何Web终端上交换加密文件来进行用户自助服务激活过程。如果您的用户处于此位置,则您可能希望延长租用间隔,以在给用户带来不便与您需要付款之间取得平衡。一旦他们付款,您就可以根据需要设置租期,直到永久。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.