TrueLicense使用

参考:

https://blog.csdn.net/qq_43403676/article/details/124578390
https://blog.csdn.net/Genmer/article/details/118574390

原理:

qingfeng这个东西没少写,但有缺陷,合理的逻辑应是:

  • license,授权,授权内容应包含授权给谁(服务器、客户等)、授权使用时限(无限期或特定时间)、授权的功能(trunk license的版本,授权可用的系统功能、模块)、授权的并发用户数(高级内容,可限制用户的并发用户量)、授权的客户端(高级内容,对于global部署的系统可限制用户的公司分部)
  • 用户服务器(license的client端)获取服务器IP、MAC等作为被授权服务器的标识。qingfeng的示例代码是在server端。。。。
  • 应对IP、MAC这些信息进行编码,计算哈希值等,应避免被授权用户知晓服务器的标识,以免被授权用户篡改,例如知晓标识为IP地址,则修改了某未授权服务器A的IP地址为授权的服务器B的IP地址后就可以非法在A服务器上运行。
    当然,应对用户告知服务器的识别信息,例如告知服务器识别信息包含IP,则用户在更换IP时提前申请license避免事故。因此标识信息应尽量使用主板、CPU标识而非IP这些容易更改的。避免合法用户的多余license注册和非法用户的盗用license需要平衡。
    服务器主机识别适用于单机软件,对于集群服务难以识别主机,应使用被授权的系统标识、数据库标识等。
  • 当用户获取到服务器标识,一般称为install key,安装码,发给授权方进行授权。
  • 授权方将安装码(识别授权给谁)和使用权限等信息编制license授权书
  • 为了保密,防止被授权方篡改、复制授权信息,例如篡改使用期限,对license加密,可使用对称或非对称加密
  • qingfeng示例使用非对称加密,因此先用jdk工具创建密钥对,然后私钥加密,将加密后的license发给用户
  • 系统在运行时,使用公钥(部署在系统的特定位置)解密license(内存),并使用license,使被授权方无法篡改license
  • 系统运行时可对license中的信息校验,例如校验时限不对,则停止服务
  • 系统运行后,可对服务进行拦截,并校验,例如校验并发数、校验功能授权等,校验不通过则服务不可用
  • 授权方如需要破解,1是通过注册机模式(kegen)生成license,因为对license校验时是从内存中加载解密的license,因此及时用户自行解密获取license也无法提供给程序
  • 2是使用破解模式(crack),找到验证license的地方或生成license的地方,去掉license的验证或伪造license,验证的地方一般多,生成license的地方少。
  • 应对办法:1.生成license的地方通过动态编译、代理等方式实现,破解方难以找到。
  • 2.调用验证的地方,破解方通过反编译可修改调用,因此使用代码混淆(丑化)使破解方无法理解代码。

生成公私密钥

  • 使用管理员允许cmd,避免创建密钥库失败
  • 进入jdk目录
    cd C:\Program Files\Java\jdk1.8.0_321\bin
  • 生成秘钥对
    keytool是jdk带的“密钥和证书管理工具”

命令:
-certreq 生成证书请求
-changealias 更改条目的别名
-delete 删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令

使用genkeypair命令生成密钥对

生成密钥对

选项:

-alias 要处理的条目的别名
-keyalg 密钥算法名称
-keysize 密钥位大小
-groupname Group name. For example, an Elliptic Curve name.
-sigalg 签名算法名称
-destalias 目标别名
-dname 唯一判别名
-startdate 证书有效期开始日期/时间
-ext X.509 扩展
-validity 有效天数
-keypass 密钥口令
-keystore 密钥库名称
-storepass 密钥库口令
-storetype 密钥库类型
-providername 提供方名称
-providerclass 提供方类名
-providerarg 提供方参数
-providerpath 提供方类路径
-v 详细输出
-protected 通过受保护的机制的口令

密钥库口令和密钥口令设置为一样即可。
证书有效期设置10年,3650天

生成密钥库
keytool -genkeypair -keysize 1024 -validity 3650 -alias "privateKey" -keystore "privateKeys.keystore" -storepass "AbcD123!" -keypass "AbcD123!" -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN"
在jdk/bin目录下生成privateKeys.keystore文件。

升级密钥库加密算法
keytool -importkeystore -srckeystore privateKeys.keystore -destkeystore privateKeys.keystore -deststoretype pkcs12

从密钥对中导出证书
keytool -exportcert -alias "privateKey" -keystore "privateKeys.keystore" -storepass "AbcD123!" -file "certfile.cer"
导出证书文件certfile.cer到当前目录(bin)

从证书中导出公钥,并导入到当前主机的密钥库中
keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.keystore" -storepass "AbcD123!"
bin目录下生成publicCerts.keystore文件

客户端功能

获取服务器信息(IP、MAC、CPU、主板)
http://localhost:8001/license/getServerInfos

server端功能

对license加密,生成加密后的license文件
http://localhost:8000/license/generateLicense

posted @ 2022-07-20 19:55  马洪彪  阅读(1540)  评论(1编辑  收藏  举报