• 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

  • 相关阅读:
    [java学习点滴]PropertiesUtil 读取properties配置帮助类
    Java快速向数据库中插入大量数据 比如10万条以上
    Java通过IO流输入输出 向文件中存入大量三个属性的值,并通过验证前两个属性输出第三个属性
    JSON 的使用方法
    jQuery easyUI id选择器 类选择器 标签选择器 属性选择器 及DOM对象和jQuery相互之间的转换
    解决request中文乱码问题
    jsp内置对象request使用方法2
    jsp内置对象request的使用方法
    easyui-dialog对话框练习
    使用combobox下拉列表框实现省 市 县 的三级联动
  • 原文地址:https://www.cnblogs.com/mahongbiao/p/16499633.html
Copyright © 2020-2023  润新知