软件系统授权方案设计

简介: 软件系统授权方案设计

背景

限制通过拷贝的方式复制和传播应用系统,保护版权。


需求

1.限制只有配置了授权文件才能正常运行


2.可设置多项限制条件,包括到期时间、用户数量


整体设计

如何加密?

该应用场景,需要系统运行期间对授权进行验证,因此必须可以反向解密,单向摘要算法如MD5不能使用。系统部署在客户方,并且java生成的中间字节码很容易被反编译,因此对称加密算法安全性较差,也不能使用。比较合适的加密算法是非对称加密,如常见的RSA,通过一对密钥对来实现加密和解密,软件系统的发行者使用私钥加密,软件系统运行时通过内置的公钥进行解密,从而提供安全性。


用什么信息作为加密项?

为避免复制和传播,授权必须与运行环境信息绑定,运行环境包括硬件和软件,硬件信息可以是mac地址、cpu序列号、硬盘序列号中的一项或几项混合,软件信息包括操作系统版本、jdk版本等,一方面注意唯一性,另一方面需考虑是否唯一不变,如虚拟化服务器硬件信息可能存在变化的情况,操作系统和jdk版本可能升级,不宜过多限制。


通常,我们有多款软件产品,还需要将软件的名称和版本号也进行加密(免费升级的情况则需要去除版本号)。


此外,如要限制使用有效期和用户数,同样需要作为加密项。


什么阶段进行授权验证?

如果在系统启动时验证,则会存在无法生成申请码的问题,因此去除该环节的验证。


业务进行时,因RSA加解密比较耗时,也不适合授权验证。


用户登录则是一个比较好的时机。


越权场景及应对

问题:如加密项只考虑mac地址,cpu序列化等服务器信息,则有可能出现单服务器部署多套软件系统问题


应对:加密项中附加运行软环境,域名/ip地址+端口 或者 软件系统对应的磁盘目录


问题:如限制用户数量,只在系统启动、添加用户环节验证,则有可能通过自动化脚本方式,在系统启动后,再从数据库层面导入用户


应对:用户登录环节验证是否合法授权。


问题:如限制ip+端口,集群环境下,是否需要为每个节点授权?用户拿到授权后再拆分成多套系统如何处理?


应对:无法杜绝,可按节点授权,单节点100%费用,增加新节点50%费用,默认只开1个http端口和1个https端口


功能设计

申请码的生成

原始加密项选择mac地址、cpu序列号、主板序列号、ip地址,拼接成字符串后取MD5,这样可以获取到一个32位简短的申请码,且无法得知哪些硬件信息参与了加密。


这样做优点就是申请码很简短,缺点是如用户说自己的授权失效了,想新申请一套,则从申请码无法得知是否是一套全新的系统。


调整优化:


使用RSA公钥,对授权对象加密后转16进制大写字母,这样可以在注册环节(生成lic文件)时可以将用户申请授权码时的硬件设备信息存档,当收到用户反馈授权失效时,可以判断是否是因为变更磁盘、CPU或网络引发的,而不是在申请另外一套系统授权。


授权文件的生成

申请码、失效日期、用户数、端口、软件编码、软件版本,私钥加密,转换为16进制大写字符串,生成lic文件。


用户无法从这一串16进制大写字符串中获取有用消息,但可以通过反编译class文件,拿到公钥,进行反编译,能看到授权文件中限制了哪些信息,如失效时间、用户数量等。


授权验证

验证申请码、失效日期、用户数、端口、软件编码、软件版本


用户登录时取20%请求验证,以避免对系统的性能影响,对于企业应用而言,登录环节因为授权验证部分登录请求耗时略长,进入系统后流畅操作,对用户体验影响较小。

目录
相关文章
|
JSON 算法 安全
不破不立!Fastjson2.0 性能炸裂,为了下一个十年
Alibaba Fastjson: 目前在人类已知范围内,这个星球跑的最快的Java JSON库。在过去的十年里,fastjson v1作为国内github star最多和最受欢迎的json解析库,如今fastjson v2 重磅来袭,性能炸裂。
18864 2
不破不立!Fastjson2.0 性能炸裂,为了下一个十年
|
7月前
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
1396 103
|
3月前
|
前端开发 数据处理
芋道审批流配置流程表单超详细介绍
芋道审批流配置流程表单超详细介绍
726 0
|
7月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
1015 4
|
9月前
|
JSON Java 关系型数据库
Hutool创建数据源工厂动态查询不同数据库不同数据表的数据
Hutool创建数据源工厂动态查询不同数据库不同数据表的数据
228 2
|
7月前
|
数据采集 监控 数据安全/隐私保护
Python正则表达式:用"模式密码"解锁复杂字符串
正则表达式是处理字符串的强大工具,本文以Python的`re`模块为核心,详细解析其原理与应用。从基础语法如字符类、量词到进阶技巧如贪婪匹配与预定义字符集,结合日志分析、数据清洗及网络爬虫等实战场景,展示正则表达式的强大功能。同时探讨性能优化策略(如预编译)和常见错误解决方案,帮助开发者高效掌握这一“瑞士军刀”。最后提醒,合理使用正则表达式,避免过度复杂化,追求简洁优雅的代码风格。
206 0
|
7月前
|
安全 Java Linux
Linux安装Elasticsearch详细教程
Linux安装Elasticsearch详细教程
1251 1
|
Java 数据库连接 mybatis
成功解决: Invalid bound statement (not found) 在已经使用mybatis的项目里引入mybatis-plus,结果不能共存的解决
这篇文章讨论了在已使用MyBatis的项目中引入MyBatis-Plus后出现的"Invalid bound statement (not found)"错误,并提供了解决方法,主要是通过修改yml配置文件来解决MyBatis和MyBatis-Plus共存时的冲突问题。
成功解决: Invalid bound statement (not found) 在已经使用mybatis的项目里引入mybatis-plus,结果不能共存的解决
|
SQL 前端开发 关系型数据库
芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略
芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略
19874 6
|
安全 UED
麒麟的版本 V10 (Lance) V10 (Tercel) 有什么区别
【6月更文挑战第26天】麒麟的版本 V10 (Lance) V10 (Tercel) 有什么区别
11280 2