文章目录
前言
最近接到一个需求,需要给我们的软件系统增加一个License授权的机制,可以把软件系统部署到客户的服务器供客户试用,到期后系统就不能使用了获取产生一些限制,需要我们提供给他新的License以后才可以继续使用。
针对这个License一般我们可能需要实现以下功能:
- 在License中保存一些配置信息,比如:有效期、服务器ID等等其他一些配置信息
- 对License进行加密处理,避免他人识别License包含的信息
- 对License签名校验,避免他人破解后,进行篡改
一、在License中保存配置
最简单能想到的是用一个json格式的字符串保存所有我们需要的配置信息,如:
{
"validTime": "2021-04-30 23:59:59",
"machineId": "FC:AA:14:4B:66:26",
"deviceNum": 10
}
1.有效期
最基础的有效期配置,限制软件只能在这个时间之前使用,可以开启一个定时任务每天0点检查是否到期,到期后软件会进入一些限制逻辑,这里值得注意的就是这是时间对比最好不要用本地时间,否则他人可以修改本机系统系统,绕过该验证。这里可以使用阿里云提供的ntp服务器查询当前时间进行对比。
2.机器ID
这个配置信息主要是防止软件服务被部署到多个机器上使用,一般可以使用MAC地址或者CPU_ID、硬盘序列号等等,只要是程序能拿到的机器唯一标示即可,具体再在软件服务启动时校验即可。
3.其他限制条件
除了我能想到的以上两个通用限制配置,还能配置一些其他个性化的配置信息,比如限制软件只能注册10个设备,就在相应添加设备的地方判断。
二、加密配置信息
以上那些配置信息直接作为一个json字符串文本放在项目里当然是很不安全的,很容易被人看懂修改,所以必须进行加密处理,这里可以使用常见的一些对称加密算法,如:3DES、AES等,算法公开,加解密速度快。但是由于是对称加密算法所以密钥也必须放在代码中,解密时使用,由于Java很容易反编译从而拿到密钥解密出License,所以仅仅对称加密肯定是不够的。
三、配置信息签名
上面说到了仅仅对称加密配置信息是不够的,所以这里可以使用非对称加密算法:RSA算法,生成公私钥对,在加密配置信息之前,计算配置信息的MD5值,然后将该值使用我们的私钥加密,附在配置信息的后面作为签名,然后再将整个信息用对称密钥加密,生成最终的密文,这个密文就可以作为我们最终的License了。就算他人反编译代码拿到了对称密钥和RSA公钥,也只能看到我们的配置信息,而无法修改,因为我们附在配置信息后的签名只能用公钥解密,没有私钥无法自己篡改后加密。
这里可能会有同学提出疑问了,为什么不直接对整个配置信息进行RSA非对称加密了,这样就不需要签名了,似乎更加简单安全,主要是因为RSA加密是有长度限制的,而且作为非对称加密,本身加解密速度相比对称加密就慢多了,RSA算法本身就不适合大量数据加解密,更适合做签名验签,我这个方案本身也是受到SSL证书 的实现所启发,HTTPS网站加解密传输数据时也是使用RSA算法验证证书,实际传输加密使用的也是对称加密算法。
总结
以上是一个软件License的实现思路,尽管我知道以上方案肯定也有破解方式,比如:我可以反编译代码后将RSA公钥替换掉,然后使用我自己的私钥签名,就可以随意更改License中的信息了。当然我也可以把License处理逻辑单独封装成模块进行代码混淆,增加反编译修改代码难度,也可以自定义Classloader加密Jar包,也可以搭建联机校验服务器,进行在线校验等等,不管你想出多少方案,正所谓道高一尺魔高一丈,都会存在破解方案,否则像微软这么大的公司也不会让盗版windows满天飞了,更多的时候是防君子不防小人。
标签:加密,License,配置,RSA,信息,签名,软件,思路 From: https://www.cnblogs.com/lidabo/p/17407712.html