您当前的位置:首页 > 计算机 > 编程开发 > 软件工程

软件License设计思路与实现方案

时间:06-05来源:作者:点击数:

前言

最近接到一个需求,需要给我们的软件系统增加一个License授权的机制,可以把软件系统部署到客户的服务器供客户试用,到期后系统就不能使用了获取产生一些限制,需要我们提供给他新的License以后才可以继续使用。

针对这个License一般我们可能需要实现以下功能:

  1. 在License中保存一些配置信息,比如:有效期、服务器ID等等其他一些配置信息
  2. 对License进行加密处理,避免他人识别License包含的信息
  3. 对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满天飞了,更多的时候是防君子不防小人。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门