我在一家销售受保护的Java 软件的公司工作。
我不会评论用户认证的方案,但我可以评论在线许可证检查。
不要让它甚至“工作两天”:这就是我盗版大多数软件的方式......虚拟机设置“及时”并在外部设置防火墙,使其不再“打电话回家”(即:只允许它与服务器联系一次,获取试用密钥),总是从新安装软件和宾果游戏的点重新映像,30 天试用(或两天试用)已成为终身试用。我为什么要这样做?当然要学习如何更好地保护我们的应用程序;)(好吧,好吧,我这样做也只是为了好玩)
我们在商业 Java 软件中所做的是在每次启动时检查许可证。
我们有成百上千的客户,从来没有人抱怨过。不止一次。我们在每次运行时生成一个唯一的类,每次运行时都不同,这既取决于在客户端启动时的独特之处,也取决于在服务器端生成的东西。
除了让应用程序在每次启动时与您的服务器联系之外,这也是收集分析数据的好方法:下载试用比率、每次试用的 nb 平均启动次数等。而且在每个网页上都有一个 Urchin/Google JavaScript 跟踪器并不令人讨厌很讨厌。
只需让人们清楚您的软件执行在线许可证检查:我们有一个巨大的复选框打开或关闭,上面写着:“在线许可证验证:OK/Failed”。就是这样。人们知道有一张支票。如果他们不喜欢它,他们就会去使用劣质的竞争对手产品,生活是美好的。
人们习惯于生活在一个有线的世界中。
由于 Internet 连接中断,您多久无法访问 GMail?您多久无法访问 Facebook 或 SO,因为您的 Internet 连接中断?
要点是:根据服务器端进行尽可能多的计算:
- 许可证检查
- 保存用户偏好
- 备份您的应用程序生成的数据
- 等等
没有人会抱怨。您将有 0.1% 的用户抱怨,无论如何您不希望这些用户:他们会抱怨其他事情并在网上发布有关您的应用程序的负面反馈。您最好让他们根本不使用您的软件并抱怨它需要始终在线的 Internet 连接(这是您的目标人群的 99.99%,因此他们不会关心抱怨),而不是让他们实际使用该应用程序,并抱怨与您的应用程序相关的其他事情。
关于反编译,.class 通常可以反编译回 .java,除非您使用的代码流混淆器可以生成有效的字节码,但无法从 .java 文件生成(因此无法取回有效的 .java 文件)。
字符串混淆器有助于使其更难弄清楚。
源代码混淆器有助于使其更难弄清楚。
像免费的 Proguard 这样的字节码混淆器使得更难(并产生更快的代码,在移动世界中尤其明显)弄清楚。
如果您只发布 Windows/Linux,那么您可以使用 Java 到本机的转换器,例如 Excelsior Jet(对于初创公司来说不是免费的而且有点贵,但它会生成本机代码,您根本无法从中找到 .java 文件)。
作为一个有趣的旁注,您会看到有人试图弄乱您的在线服务器......在大约 30 位 beta 测试人员中,我们已经有人(我们知道试用的一部分)试图盗版我们的在线服务器。