Qt之程序加密授权[1]

概述:

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

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_OBJECT

public:
    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-f
		lic.clear();
		lic = hashData.toHex();
		strData += lic;
		file.write(strData.toUtf8());
	}
	file.close();
}

void LicenseManagement::Slot_Canncel()
{
	close();
}

void LicenseManagement::Slot_Browse()
{
	//打开.text
	QString 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-04
	IP Address=169.254.177.150
	System ID=PGSXP0JK9CPQDR
	Ethernet Address=AC:D6:64:54:EC:35
	Processor ID=BFEBFBFF001906ED

生成.lic文件

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

程序运行效果图:

在这里插入图片描述

over:

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

文末一句话:

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值