我正在尝试决定如何为我编写的某些软件实施非常基本的许可解决方案。该软件将在我的(假设的)客户端机器上运行,其想法是如果客户端在大于n的机器上运行它,软件将立即退出(带有友好消息)(n是许可证的数量)已购买)。此外,客户非技术娴熟,“基本”足够好。
这是我目前的设计,但考虑到我对这个主题几乎没有经验,我想在开始任何开发之前先询问它:
我认为这涵盖了我的初始设计。目的是虽然它肯定不是完全证明,但我认为我至少有点难以创建一个易于共享的破解解决方案。此外,我可以轻松调整给定客户端/密钥对的许可证金额。
我必须认为这之前已经完成了一百万次,所以告诉我一个更好的解决方案,它实现起来同样简单,并提供相同(低)的安全性。如果使用外部库,我更喜欢Java,因为这就是软件编写的内容。
答案 0 :(得分:5)
我建议它可能不值得麻烦。客户可能不是那些精通技术的人,但如果值得花时间,他们就会破解它,如果不是,他们就不会使用你的软件了。
您不讨论配置过程 - 您如何知道哪台机器包含MySQL数据库。如果MySQL数据库出现故障,你不会讨论会发生什么。
坦率地说,第一次出现问题时,他们可能会发现他们不喜欢软件足以继续使用它,或者他们会弄清楚如何规避系统。即使最终用户不精通技术,他们也可能拥有内部技术支持。我不会浪费你的时间。如果您需要许可证管理系统 - 请使用专业管理系统。否则,就信任和合理的法律条款开展工作。
答案 1 :(得分:3)
我建议不要实施这样的计划。如果您的客户端出现连接问题或MySQL数据库出现故障,该怎么办?你最终会遇到一些生气的客户。
但是,如果你打算实施这样的方案,这里有一些建议:
不要让你的密钥顺序,要么生成随机密钥,要么做E(K,H(clientID + licenseID)),其中E是加密函数,K是一些密钥,H是哈希函数。
如果您担心将应用程序指向一些验证始终服务器,那么您假设他们足够精通技术。那么,是什么阻止他们只需将服务器的所有连接重新路由到使用出站路由器上的IPTABLES之类的同一验证服务器,或者更改其/ etc / hosts文件。拥有硬编码的静态IP会假定您的服务器永远不会移动。如果您决定更换ISP怎么办?此外,即使您没有ISP,有时也会出于各种原因重新编号他们的网络。
为了避免#2中陈述的问题,您必须实施某种挑战响应系统。客户端将随机字符串与许可证数据一起发送到您的服务器,并使服务器加密或使用一些已知密钥对其进行哈希处理。更好的是使用公钥方案。
如果您的服务器实际为您的程序执行某些计算,这些方案通常会起作用。选择一些不经常执行的东西,这样你的服务器就不会陷入困境。此外,它必须是一些非常重要的东西,所以这将是破解者不会只是在假的服务器中实现它。当然,如果你的程序无法运行,它必须是必不可少的东西。
答案 2 :(得分:1)
我担心的主要问题是:(a)如果客户想要在没有连接到互联网的情况下运行该怎么办?好吧,也许你的应用程序固有地需要连接到Internet来做有意义的工作。但如果没有,您的某个客户是否可能希望在旅途中在笔记本电脑上运行该应用程序,或者某些其他无法连接互联网的情况?或者也许他们的联系目前正在下降。等
(b)如果您的验证服务器出现故障怎么办?当反盗版功能陷入困境并且在我完全合法时阻止我使用软件时,我非常恼火,并且我听到了许多其他人的类似抱怨。
另一方面,尽管制定需要某种“许可证密钥”的方案很容易,但要防止用户在两台机器上使用相同的许可证密钥更加困难。我不知道如何控制已安装或正在运行的实例的数量,而没有像您描述的那样监视它们的某种“许可证服务器”。
您认为盗版有多大问题?你的应用程序是大多数客户只能使用一个或两个副本,或者可能需要很多副本的东西吗?如果是前者,所有额外的努力可能都不值得。如果是后者,不同的故事。
我在一些商业产品上看到的一种技术是让客户在他们自己的本地网络中的一个盒子上安装“许可证服务器”,然后这个服务器加载了许多许可证密钥和客户端验证这一点。它不需要一个华丽的黑客来打败这个 - 只需设置两个许可证服务器,复制密钥,并将一些客户端指向一个客户端,另一个客户端指向另一个 - 但它使诚实用户能够遵守许可证限制而无需担心互联网中断。
我尝试过的一个想法是设置一个像你描述的验证服务器,但是如果连接尝试失败,我们会记录它并让它继续,并且只在一段时间内阻止访问 - 我认为是一个星期 - 没有设法建立联系。这样临时的互联网中断不会给用户带来不便。
简短的回答:你的想法应该有效,但有潜在的吸引力。