参考一
自研软件为了防止被人任意复制传播,需要设置注册使用模式。基本原理:通过计算机的特异性编号,加上自己的编码,使用加密算法算出一个生成码。
一、计算机的特异性编号
硬盘的编号:最后一块硬盘的编号就行(有些计算机可能有多块硬盘);
CPU的编号;
网卡的编号;最后一块网卡的MAC地址就行;
BIOS的编号;
获取系统的安装日期;
1.1 函数示例
#include <QProcess>QString getWMIC(const QString &cmd)
{//获取硬盘的序列号:wmic diskdrive get serialnumber//获取cpu的序列号:wmic cpu get processorid//获取网卡的MAC地址:wmic nicconfig get macaddress//查询BIOS序列号:wmic bios get serialnumber//查询操作系统安装时间:wmic os get installdate//QString cmd="wmic cpu get processorid";QProcess p;p.start(cmd);p.waitForFinished();QString result = QString::fromLocal8Bit(p.readAllStandardOutput());QStringList list = cmd.split(" ");result = result.remove(list.last(), Qt::CaseInsensitive);result = result.replace("\r", "");result = result.replace("\n", "");result = result.simplified();return result;
}
1.2 工程化处理
获取的这些序列号都很长,而且不同windows版本的电脑,wmic命令可能不同,所以需要进行工程化处理。
(1)各类序列号只取最后一块的;
(2)各类序列号只取后4位,但是:MAC地址取后2位,系统安装时间取前8位;
(3)对于无效查询,将其跳过,但是:如果所有的查询都无效,直接禁止使用软件。
1.3 示例代码
//函数:读取计算机硬件信息
QString KeyGen::GetPCMsg(void)
{//获取硬盘的序列号:wmic diskdrive get serialnumberQString tempStr=getWMIC("wmic diskdrive get serialnumber");QString pwd1 = tempStr.right(4); // 截取字符串的右边字符//获取cpu的序列号:wmic cpu get processoridtempStr=getWMIC("wmic cpu get processorid");QString pwd2 = tempStr.right(4); // 截取字符串的右边字符//获取网卡的MAC地址:wmic nicconfig get macaddresstempStr=getWMIC("wmic nicconfig get macaddress");QString pwd3 = tempStr.right(2); // 截取字符串的右边字符//查询BIOS序列号:wmic bios get serialnumbertempStr=getWMIC("wmic bios get serialnumber");QString pwd4 = tempStr.right(4); // 截取字符串的右边字符//查询操作系统安装时间:wmic os get installdatetempStr=getWMIC("wmic os get installdate");QString pwd5 = tempStr.left(8); // 截取字符串的右边字符return pwd1+pwd2+pwd3+pwd4+pwd5;
}
二、加密算法
使用Qt自带的MD5算法。
#include <QCryptographicHash>//加密所需// MD5 加密
QString MD5_encryption(const QString &data)
{QCryptographicHash md5(QCryptographicHash::Md5); //使用MD5加密md5.addData(data.toUtf8(),data.size()); // 添加数据QByteArray bArry = md5.result(); //获取MD5加密后的密码QString md5_data;md5_data.append(bArry.toHex());return md5_data;
}
三、验证是否注册
验证注册号:读取ini文件,和程序计算的结果进行对比。
3.1 main.cpp文件
#pragma execution_character_set("utf-8")#include "mainwindow.h"
#include <QApplication>
#include "keygen.h"
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;if(KeyGen::verifyKey()){//验证成功w.show();return a.exec();}else{//验证不成功QMessageBox::warning(NULL, "警告","该软件还未注册,请联系软件开发师注册使用!");return 0;}
}
3.2 keygen.h文件
#ifndef KEYGEN_H
#define KEYGEN_H#include <QProcess>//获取计算机信息所需
#include <QCryptographicHash>//加密所需
#include <QDebug>//打印日志所需
#include <QSettings>//读取配置文件所需
#include <QDir>//读取配置文件所需QString getWMIC(const QString &cmd);
// MD5 加密
QString MD5_encryption(const QString &data);class KeyGen
{public:KeyGen();~KeyGen();//函数:读取计算机硬件信息static QString GetPCMsg(void);//函数:生成注册码static QString generateKey(QString);//函数:验证注册码static bool verifyKey();
};//构建函数
KeyGen::KeyGen()
{
}//析构函数
KeyGen::~KeyGen()
{
}//函数:读取计算机硬件信息
QString KeyGen::GetPCMsg(void)
{//获取硬盘的序列号:wmic diskdrive get serialnumberQString tempStr=getWMIC("wmic diskdrive get serialnumber");QString pwd1 = tempStr.right(4); // 截取字符串的右边字符//获取cpu的序列号:wmic cpu get processoridtempStr=getWMIC("wmic cpu get processorid");QString pwd2 = tempStr.right(4); // 截取字符串的右边字符//获取网卡的MAC地址:wmic nicconfig get macaddresstempStr=getWMIC("wmic nicconfig get macaddress");QString pwd3 = tempStr.right(2); // 截取字符串的右边字符//查询BIOS序列号:wmic bios get serialnumbertempStr=getWMIC("wmic bios get serialnumber");QString pwd4 = tempStr.right(4); // 截取字符串的右边字符//查询操作系统安装时间:wmic os get installdatetempStr=getWMIC("wmic os get installdate");QString pwd5 = tempStr.left(8); // 截取字符串的右边字符return pwd1+pwd2+pwd3+pwd4+pwd5;
}//函数:生成注册码
QString KeyGen::generateKey(QString data)
{data="XXXX"+data+"XXXX";return MD5_encryption(data);
}//函数:验证注册码
bool KeyGen::verifyKey()
{//读取注册表文件License.iniQString importfilepath=QDir::currentPath()+"/License.ini";QSettings *mConfigIni = new QSettings(importfilepath, QSettings::IniFormat);QString mKey_Local=mConfigIni->value("Key").toString();qDebug()<<mKey_Local;//读取系统配置并生成注册码QString tempStr=GetPCMsg();QString mKey_Now=generateKey(tempStr).left(8);qDebug()<<mKey_Now;//判断if(mKey_Local==mKey_Now){return true;}else{return false;}
}QString getWMIC(const QString &cmd)
{//获取硬盘的序列号:wmic diskdrive get serialnumber//获取cpu的序列号:wmic cpu get processorid//获取网卡的MAC地址:wmic nicconfig get macaddress//获取主板的序列号:wmic baseboard get serialnumber//查询BIOS序列号:wmic bios get serialnumber//查询操作系统安装时间:wmic os get installdate//QString cmd="wmic cpu get processorid";QProcess p;p.start(cmd);p.waitForFinished();QString result = QString::fromLocal8Bit(p.readAllStandardOutput());QStringList list = cmd.split(" ");result = result.remove(list.last(), Qt::CaseInsensitive);result = result.replace("\r", "");result = result.replace("\n", "");result = result.simplified();return result;
}// MD5 加密
QString MD5_encryption(const QString &data)
{QCryptographicHash md5(QCryptographicHash::Md5); //使用MD5加密md5.addData(data.toUtf8(),data.size()); // 添加数据QByteArray bArry = md5.result(); //获取MD5加密后的密码QString md5_data;md5_data.append(bArry.toHex());return md5_data;
}#endif // KEYGEN_H
四、注册机
void MainWindow::on_pushButton_clicked()
{QString tempStr=ui->lineEdit->text();if(tempStr!=NULL){ui->lineEdit_2->setText(KeyGen::generateKey(tempStr).left(11));}
}