Qt之程序加密授权[1]

  • 概述:
  • 授权流程说明
  • 生成lic文件示例代码:
    • .h:
    • .cpp:
    • 服务生成的.txt内容:
    • 生成.lic文件
    • 程序运行效果图:
  • over:
  • 文末一句话:

概述:

首先说下我本人对应用程序授权加密实现思路:

1.单机版:
单机版实现思路比较简单,实现一个生成授权Lic文件应用程序(我们使用),生成的Lic文件给应用程序(客户使用)启动时读取一下对比加密后的字符串或自定义格式的密钥判断是否正确;

2.局域网版:
局域网版授权加密我选择使用tcp来实现,一台server多台client,我们只需要授权服务器就可以,我们通过生成lic文件告诉服务器授权时间、授权客户端数量;
首先服务在后台一直运行,有客户端启动访问服务,服务去做一些逻辑处理(读取lic)然后告诉客户端是否授权成功;
局域网版好处就是我一个lic文件可以掌管多台电脑,但也存在不足各有利弊吧,看具体需求是什么;

3.网络版:
.网络版授权加密实现逻辑跟局域网版一样;
补充一下:单机版、局域网版与网络版本人是采用配置文件进行配置,这样程序上不需要做什么改动,并可以根据需求灵活配置即可;

授权流程说明

1.首先客户启动服务获取当前设备得详细信息,例如:主机名称、本机ip、MAV地址、硬盘序列号id、cpuID等等;
获取设备信息文章链接
2.将获取得设备信息通过程序生成.txt文件;
3.我们拿到客户那边服务生成的txt文件,我们通过Lic.exe解析读取,并通过自定义算法或可以采用Qt自带算法生成.lic文件给到客户;
4.客户拿到.lic文件,在通过服务进行读取。进行完这一步我们授权整个流程结束,客户那边就可以启动应用程序(内嵌客户端)会主动访问服务我申请授权,服务回复授权通过,客户就可以正常使用应用程序;

生成lic文件示例代码:

加密算法本人使用Qt自带的加密算法,下方代码中有所体现

.h:

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_LicenseManagement.h"class LicenseManagement : public QMainWindow
{Q_OBJECTpublic:LicenseManagement(QWidget *parent = Q_NULLPTR);void init();private slots:/**  @brief:读取并解析服务生成的.txt文件*/void Slot_Browse();/**  @brief:生成lic文件按钮*/void Slot_Generator();/**  @brief:关闭*/void Slot_Canncel();
private:Ui::LicenseManagementClass ui;QStringList list;
};

.cpp:

#include "LicenseManagement.h"
#include <QFileDialog>
#include <QCryptographicHash>
#include <QMessageBox>
#include <QDate>LicenseManagement::LicenseManagement(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);init();
}void LicenseManagement::init()
{connect(ui.pushButton, &QPushButton::clicked, this, &APDLicenseManagement::Slot_Browse);connect(ui.pushButton_3, &QPushButton::clicked, this, &APDLicenseManagement::Slot_Generator);connect(ui.pushButton_4, &QPushButton::clicked, this, &APDLicenseManagement::Slot_Canncel);ui.ExpiryDate->setDate(QDate::currentDate());
}void LicenseManagement::Slot_Generator()
{if (list.size() == 0)return;QString file_name = QFileDialog::getSaveFileName(NULL, "Save File", "", "XML (*.lic)");QFile file(file_name);if (file.open(QIODevice::WriteOnly | QIODevice::Text)){//日期特殊处理QDate date = ui.ExpiryDate->date();QString strDate = date.toString("yyyy/MM/dd");//进行加密字符串<用户名-IP-SYSID- - -DATA-NUMBER-TYPE>QString lic = list.at(0).split("=").at(1) +     list.at(1).split("=").at(1) +list.at(2).split("=").at(1) + list.at(3).split("=").at(1) + list.at(4).split("=").at(1) +strDate +QString::number(ui.spinBox_number->value())+ui.LicenseType->currentText()+ QDate::currentDate().toString("yyyy/MM/dd");//整理详细信息QString fuhao = "=";QString name = ui.LicenseTo->text();              //用户QString type = ui.LicenseType->currentText();       //单机-网络QString data = strDate;                             //授权终止日期QString time = QTime::currentTime().toString();        //时间QString num = QString::number(ui.spinBox_number->value());  //用户数量QString sdate = QDate::currentDate().toString("yyyy/MM/dd");//授权起始时间(为生成授权文件时间)QString strData = name + fuhao + type + fuhao + data + fuhao + time + fuhao + num + fuhao + sdate + fuhao;//使用Qt自带加密算法QByteArray hashData = QCryptographicHash::hash(lic.toLocal8Bit(), QCryptographicHash::Sha3_512);//返回字节数组的十六进制编码,编码使用数字0-9和字母a-flic.clear();lic = hashData.toHex();strData += lic;file.write(strData.toUtf8());}file.close();
}void LicenseManagement::Slot_Canncel()
{close();
}void LicenseManagement::Slot_Browse()
{//打开.textQString file_name = QFileDialog::getOpenFileName(NULL, "Save File", "", "XML (*.txt)");ui.SystemInformationFile->setText(file_name);QFile file(file_name);if (file.open(QIODevice::ReadOnly | QIODevice::Text)){list.clear();list = QString::fromUtf8(file.readAll()).split("\n");//整行取出;if (list.size() < 5){file.close();return;}QString n = "\n";//设置数据ui.SystemInformationFileBrowser->setText(list.at(0).split("=").at(1)+ n + list.at(1).split("=").at(1) + n + list.at(2).split("=").at(1) + n + list.at(3).split("=").at(1) + n + list.at(4).split("=").at(1));//授权主机用户名ui.LicenseTo->setText(list.at(0).split("=").at(1));}file.close();
}

服务生成的.txt内容:

 Host Name=Fantast-RD-04IP Address=169.254.177.150System ID=PGSXP0JK9CPQDREthernet Address=AC:D6:64:54:EC:35Processor ID=BFEBFBFF001906ED

生成.lic文件

Fantast-RD-04=Stand-alone=2021/03/24=14:24:51=1=2021/02/24=
7e1f698e49b5c7f7d376ab3c5b30b8343e5bcb24e3d5712eedec134d33ff9d40be7a14bb29ee1a0074792843b21841186de0f4a1de1dde1606263a02a7e18a61

程序运行效果图:

over:

欢迎大家关注作者在文末评论、点赞、转发以及批评指正!
如果大家有更好的方法或有问题可以在文末评论一起讨论!
共同学习!
共同进步!

文末一句话:

把你的弱点变成根据地,从这里出发走向胜利。

Qt之程序加密授权[1]相关推荐

  1. Qt/C++程序防拷贝及限制多次安装的一个简单案例

    前言 最近因项目需求:安装后的程序即使拷贝其他电脑也不使用,安装包只能在一台电脑安装,在此电脑安装后不能在其他电脑安装即使单独拷贝安装包也不能安装.另外就是不使用加密狗或者license key等,而 ...

  2. .net 程序加密方法

    .net 程序加密,一般是对生成的exe文件或者dll直接进行加壳,配合加密锁或者许可进行授权控制,既能保证安全性,又控制软件的使用. 加壳工具的选择 一般要考虑几点,第一是加壳的安全性,不能被轻易脱 ...

  3. 控件与应用程序许可授权的100%托管的先进控件IntelliLock

    IntelliLock是一个能用于控件与应用程序许可授权的100%托管的先进解决方案.与.NET Reactor提供的基于源代码保护的授权许可系统不同,IntelliLock选择了以100%托管的方式 ...

  4. 开源软件加密授权方案_身份验证和授权作为开源解决方案服务

    开源软件加密授权方案 通过实施身份验证和授权(a&a)机制为所有用户数据设计集中式服务. 我将分享我的经验并最终确定解决方案的结论. 该设计包括客户端(Web应用程序)和服务器(A&A ...

  5. 组态王授权产品id和授权锁id_软件加密授权工具推荐

    公司研发一套软件,需要开始往外卖,苦于上市后盗版压力比较大.于是寻找了一款软件加密授权工具-Virbox LM. Virbox LM在加密方面,能快速的完成加密工作,不需要编写代码,安全强度也很高.授 ...

  6. 移动端应用视频小程序加密播放(存档)

    (转载文档备用  2018-12-11) 1.概述   移动端视频的小程序加密播放设置开启后,通过下文设置步骤,视频播放请求m3u8可以在APP.小程序内正常播放.   POLYV云平台接收到参数后会 ...

  7. 小程序登录授权获取用户信息

    一  登录 时序图如下: wx.login() 获取js_code 示例代码: App({ onLaunch: function() { wx.login({ success: function(re ...

  8. 推荐一款软件加密授权工具

    公司研发一套软件,需要开始往外卖,苦于上市后盗版压力比较大.于是寻找了一款软件加密授权工具-Virbox LM. Virbox LM在加密方面,能快速的完成加密工作,不需要编写代码,安全强度也很高.授 ...

  9. linux系统下Qt应用程序重启,嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws)...

    嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws) 应用软件一般都有这样的业务需求: 当有新版本的APP,则程序就需要执行更新,更新完毕后(所谓的更新大多就是以覆盖的方式),不需要关 ...

最新文章

  1. 配置国内 Docker Registry Mirror
  2. java 线程关闭小结(转)
  3. 凭证 90000000 保存(帐户确定出错)
  4. 常见的js算法面试题收集,es6实现
  5. php中id如何与删除关联,ThinkPHP查询语句与关联查询用法实例
  6. Linux time()函数解析
  7. 查看cp进度,使用watch
  8. 在.net2.0下使用System.Web.Script.Serialization;
  9. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理
  10. 如何注册申请 Google AdSense
  11. java把含小数点的数字字符串转换为int类型
  12. php表示昨天_php获取今天、昨天、明天的日期
  13. matlab db(X R),matlab操作sqlite数据库
  14. 大师兄科研网_挑战杯经验分享会与你话科研
  15. 责任分配矩阵和raci的区别_数字音频处理器和调音台的区别是什么
  16. Vim快捷键(四):Vim查找与替换
  17. Origin 画图——简单的柱状图画法
  18. Android常用应用市场和应用包名
  19. 第一次基因数据处理从集群到数据处理结果---构建菌群物种丰度的图谱
  20. 【寻找最佳小程序】12期:小程序数据助手——微信官方打造,移动端数据分析工具...

热门文章

  1. 电动汽车 simulink仿真模型,可进行整车动力性仿真测试(最高车速,最大爬坡,加入时间)和NEDC工况能耗测试(电耗)
  2. c语言炒股软件公式,20年的炒股实战公式让你认清股市本质 想不发财就难 源码放送 送给有缘人...
  3. c++ 汉字字符处理
  4. vue项目创建及配置选择
  5. 菜鸟学Java从入门到......
  6. Java对象内存布局和对象头
  7. Maven学习:常用mvn命令
  8. 使用Markdown排版微信公众号 代码格式化
  9. 慢跑在一座陌生的城市
  10. 【收藏向】电路(下) 思维导图 3小时不挂科(邱关源教材)