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