说说license机制
说说license机制
背景
license一个软件产品里面一个比较边缘的功能,在一般情况下,不会被重视.也因为如此,很少有人认真研究过license,一般能用就可以了.
曾经我也以为java上没有成熟的license机制,因为jvm指令规范的特性,导致在java语言上,增加license,是一个特别困难的事情.目前绝大多数的license机制,如果对java语言有比较熟悉的了解,大多数的license机制都能在1天内被破解.加了等于没加,相当于只能对外宣称有license,一个花瓶而已.
而成熟的license机制,可以确保核心逻辑不泄露.从这点出发,应该是目前java领域内,各种软件趋近于同质化的一个根本原因.因为保护机制没做好,很容易被业内人士利用.
另外需要考虑的是,产品是通过成品的方式发布出去的,甚至还需要提供部分源码,提供基于IDE的开发环境,在IDE可以调试的模式下,再考虑license,难度就又上了一个层次.
java上常见的破解机制
在java语言上,常见的破解机制包括但不限于
- 利用类加载机制,对应用中的类进行替换
- 利用反编译工具,了解license逻辑,破坏检测逻辑
- 利用内存工具查看license内容,重新生成license信息
所以,一个成熟的license机制,应该能正常应对上述内容,并利用已知的特性,增加破解难度.

目前的license机制,都在授权文件和检测机制部分做了大量的工作,各种加解密,各种计算,而真正的破解,往往是在应用和检测机制之间,通过上述的破解手段,让检测机制失效,才应该是重点.
而检测机制和应用的结合点,恰恰是受到jvm机制影响对大的部分,也是最容易被攻破的地方.
老子天下第一
针对上述的破解机制,在license策略制定的时候,就应该针对性的考虑到一些问题
- 不应该存在lincese的对象,类的存在会非常容易破解
- 内存里面存储的所有信息,都应该加密,这边的加密不是开放加密算法,应该是私有加密算法
- 反编译工具的使用是无法避免的,但是可以避免的是利用反编译还原代码,还原的代码无法正常编译
将所有的道路封死,然后把破解的路径逼到只能去破解或还原私有加密/解密算法,那么破解一个license的难度至少会达到1个月以上,这样破解的人员就会重新考虑,这种破解路径是否值得,最终达到无法破解的目的.
私有加密算法
私有加密算法和开放的加密算法存在和重点不一样.开放的加密算法,是为了纯粹的防止信息泄露,通过线下保存密钥达到无法破解的目的.而license内的私有加密算法,完全没有必要计算的那么复杂,只需要对加密的内容进行简单的替换即可.
随便说一个加密/解密算法
针对一个string,得到byte数组,针对byte数组,每N个byte进行替换/转换,再base64
一般100行内的代码即可满足,因为是私有加密算法,算法可以随意调整,比如,byte在转换的时候,能不能加上异或操作,移位操作,随便一个操作,都是一种加密/解密算法.
甚至,只修改base64编码串的数组位置,就能得到私有的base64算法,更绝.
诚邀挑战
按照上述逻辑,我写了一个简单的程序,各位有追求的小朋友,可以来挑战一下.
项目地址: https://gitee.com/senvon/license-test.git
挑战人员,请按照readme内容,进行环境搭建和部署,如果出现jar包下载不到的情况,请注意配置settings.xml文件
