TrueLicense使用

2022-09-08 20:29:05 浏览数 (1)

参考:

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 FilesJavajdk1.8.0_321bin
  • 生成秘钥对 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

0 人点赞