早些年开源过一个秘钥生成器,做的比较粗糙,离真正的商业应用还差点距离,这次在用户的强烈要求下,对秘钥认证这块做了重新的改版,对原有的类进行了重写,重写后一个类不到300行完成所有的事情,并提供了完整的生成秘钥示例和使用示例。在很多商业软件中,需要提供一些可以试运行的版本,这样就需要配套密钥机制来控制,纵观大部分的试用版软件,基本上采用以下几种机制来控制。
秘钥认证类功能
void AppKey::checkKey(const QString &fileName, char keyCode)
{
//判断密钥文件是否存在,不存在则从资源文件复制出来,同时需要设置文件写权限
QFile keyFile(fileName);
if (!keyFile.exists() || keyFile.size() == 0) {
QMessageBox::critical(0, "错误", "密钥文件丢失,请联系供应商!");
exit(0);
}
//读取密钥文件
keyFile.open(QFile::ReadOnly);
keyData = keyFile.readLine();
keyFile.close();
//将从注册码文件中的密文解密
keyData = getXorEncryptDecrypt(keyData, keyCode);
QStringList data = keyData.split("|");
if (data.count() != 6) {
QMessageBox::critical(0, "错误", "注册码文件已损坏,程序将自动关闭!");
exit(0);
}
//挨个取出对应项的内容
keyUseDate = (data.at(0) == "1");
keyDate = data.at(1);
keyUseRun = (data.at(2) == "1");
keyRun = data.at(3).toInt();
keyUseCount = (data.at(4) == "1");
keyCount = data.at(5).toInt();
//如果启用了时间限制
if (keyUseDate) {
QString nowDate = QDate::currentDate().toString("yyyy-MM-dd");
if (nowDate > keyDate) {
QMessageBox::critical(0, "错误", "软件已到期,请联系供应商更新注册码!");
exit(0);
}
}
//如果启用了运行时间显示
if (keyUseRun) {
timer->start();
}
}
bool AppKey::checkLicense(const QString &fileName)
{
QFile keyFile(fileName);
if (!keyFile.exists() || keyFile.size() == 0) {
QMessageBox::critical(0, "错误", "密钥文件丢失,请联系供应商!");
exit(0);
}
//读取密钥文件
keyFile.open(QFile::ReadOnly);
keyData = keyFile.readLine();
keyFile.close();
//拿到机器码
QString cpuid = getCpuId();
QString number = getBoardNum();
QStringList keys;
int count1 = cpuid.count();
int count2 = number.count();
int count = qMin(count1, count2);
for (int i = 0; i < count; i++) {
keys << QString("%1%2").arg(cpuid.at(i)).arg(number.at(i));
}
//拿到key大写并去除空格
QString key = keys.join("").toUpper();
if (key.contains(" ")) {
QStringList list;
for (int i = 0; i < key.count(); i++) {
if (key.at(i) != ‘ ‘) {
list << key.at(i);
}
}
key = list.join("");
}
//MD5加密,也可以选择其他加密方式
QByteArray result = QCryptographicHash::hash(key.toLatin1(), QCryptographicHash::Md5).toHex().toUpper();
if (result != keyData) {
//自动复制一下等待粘贴到秘钥工具生成秘钥
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(key);
QString info = QString("密钥文件错误,请联系供应商! 已自动复制机器码!\n机器码: %1").arg(key);
QMessageBox::critical(0, "错误", info);
exit(0);
}
}
?
原文:https://blog.51cto.com/u_15246509/3035393