我有这个java swing应用程序,我打算通过互联网销售。目前,我倾向于使用java webstart部署应用程序。该产品将被许可用户仅在一台计算机上使用该程序。我担心这种模式的盗版行为。我想安装一些安全功能来强制执行许可证模型。目标是至少使许可用户难以将已安装的产品(包括许可证密钥)复制到未经许可的用户。以下是我现在正在考虑的选项:
每次启动程序时,强制用户使用用户名/密码向母舰进行身份验证。
只需在用户PC上注册并付费后,在某处(隐藏?)安装许可证密钥即可。在运行时,验证是否安装了有效的许可证密钥。
使用/构建基于用户计算机硬件指纹的安全包。每次启动应用程序时都会计算此指纹,并使用某种哈希值与本地安装的许可证密钥进行比较。此许可证密钥仅对此硬件指纹有效。
这里的一个问题是,一旦安装了这个应用程序,除了使用java webstart检查应用程序更新之外,应用程序没有任何运行时需要联系母船。应用程序在本地执行的所有操作都会使用swing将结果显示给用户。因此,涉及母船的任何解决方案基本上都意味着构建服务器基础架构仅用于许可证验证。
我想我正在寻找的东西是基于java的,至少在某种程度上是安全的,易于部署并且不会给用户带来痛苦。您使用了哪种安全/许可方法?
编辑:我应该补充一点,我不一定要寻找一个银弹来防止绝对每个人都打败安全。总会有人有足够的时间来找到完成任务的方法。我不是那么关心这些家伙。我基本上希望让临时用户只需复制许可证密钥并发送给他的好友。正确实施后,解决方案应该让临时用户相信购买它更简单。
答案 0 :(得分:10)
我会说(2)是你最好的选择。您已经在(1)中谈过自己,如果用户购买新主板,(3)会引起问题。 (2)对合理的计算机用户不会提供太多保护,但也不应该引起太多问题。
但最终,你无能为力将阻止一个坚定的用户盗用你的软件。
事实上,最有效的反盗版软件开发策略是最简单的一种:
- 有一个很棒的产品。
- 为它收取合理的价格。
醇>
答案 1 :(得分:9)
IMO,尝试在客户端强制执行复制保护可能比它的价值更麻烦。你将花费无数个小时试图超越你的客户(你可以花几个小时来改善你的产品),但最终海盗将永远赢。
但您还有其他选择:
答案 2 :(得分:3)
老实说,除非程序实际需要来自服务器的数据才能运行(正如fred-o所说魔兽世界需要的;并且是真的),那么 nothing 你可以做客户端那个将是完全万无一失的。您拥有的所有3个想法都可以轻松规避。服务器/登录可能有点困难,但我甚至看到裂缝到本地创建一个虚拟登录服务器,所以该程序认为它正在被验证。
防止盗版的唯一真正方法是拥有一些程序需要运行的服务器端逻辑。例如 - 你正在制作调整图像大小的软件(我知道,我知道)。如果原始映像已发送到您的服务器并在那里重新调整大小然后发送回客户端(而不是客户端进行大小调整),那么您将是安全的,因为您的服务器可以通过某种登录系统轻松保护。如果没有有效的用户名或密码(或者如果他们试图生成假的用户名或密码),该程序将毫无用处。
如果您实现客户端功能,无论您做什么,都可以访问它。
答案 3 :(得分:3)
我最好的选择是,实施一个简单的解决方案,这个解决方案不会给您带来太多的负担,并且不会让客户愤怒,也会阻止偶尔的盗版行为。任何更复杂的事情都将成为一场军备竞赛。一个难以获胜的人。
答案 4 :(得分:2)
在你的三个解决方案中:
第一个需要网络连接才能做任何事情。如果用户无法离线使用,他们将不会感到高兴。谷歌必须为其办公软件处理这个问题。
第二个没有太多的复制保护,除非隐藏位置,并且隐藏位置有其自身的困难(例如,有些人不喜欢安装喜欢在不同位置隐藏东西的应用程序),而不是无论如何都要安全。
第三个可能会起作用,直到用户对更改指纹的计算机执行某些操作(我不知道您要检查的内容),或者想要将应用程序从一台计算机移动到替换计算机。那么你将有一个潜在的愤怒用户。 (“我更换了硬盘驱动器/移动到不同的LAN连接/系统故障/无论如何,[删除已删除]的东西停止工作!”)
因此,虽然数字2不太可能导致用户出现问题,但它不适用于大部分复制保护方案。数字1和3会让你不满意的用户,对你来说会有一定的麻烦,并且无论如何都不会阻止确定的人复制它。
答案 5 :(得分:1)
我会认真重新考虑许可要求,因为执行这些要求会失去合法客户。如果你是一家大公司,你可以负担得起,但如果你是一个创业公司或个人,你就不能。
一种方法是提供个人许可 - 适用于个人使用的所有机器。无论好坏,人们都认为软件“应该”出售。如果你让他们为他们使用的每台机器付费,他们就会觉得你正在利用它们,那就是当他们开始在网上搜索别人的许可证密钥时。
如果合适,您还可以提供公司许可证,或10包许可证,或其他任何一种,以获得折扣而不是单独购买。这为个人和组织提供了合法使用软件的方法,这些方法并不会让他们觉得你不合理地挤压它们。
答案 6 :(得分:0)
考虑使用JNLP在您的应用程序中使用时间限制组件 - 许可证模块? - 必须通过互联网定期更新。更新版本的可访问性需要注册。让
在禁用功能之前,有一段很长的宽限期,允许用户离线(或不想升级)。
答案 7 :(得分:0)
除非应用程序已经需要连接到网络才能完成实际工作,否则打电话回家可能很容易被归类为间谍软件。
我不确定这是否适用于Java Web Start,但由于防火墙可能阻止您的应用程序打电话回家,您的付费客户可能仍会看到他们的应用程序被阻止。
所以:我不会经常使用手机回家的东西。
(至于许可证密钥:如果一个密钥仅适用于特定的注册名称,并且如果该名称显示在某个“关于”对话框中,那么我不会担心它会依赖于硬件。当然,一些注册名称及其名称密钥将被共享,但任何更加花哨的东西都不值得付出努力。如果我的Mac失败了,那么看到我在新硬件上的一键式Time Machine恢复使你的应用程序无法启动我就不会觉得好笑。)