软件定时注册的设计

软件注册功能需求

1、授权时间区间。 比如2020年1月1日至2020年3月1日有效。 2、软件只能在一个主机上面使用,授权后不能更换主机。 比如假如在A主机授权之后,拷贝到B主机该软件要求不能正常使用。 3、不允许通过更改系统时间来达到破解目的。 4、要求低成本解决方案,尽量在软件内部解决问题。

设计思路

1、通过路径下面添加License文件的方式来实现,但是文件内容必须要加密,软件内部设置定时器,定时读取License文件内容,1分钟读取一次,一旦读取失败,软件自动进入无授权提示界面。 License文件内容包括:

  1. 软件注册时间,即软件输入注册码时间,要求软件注册必须连网,读取网络时间非主机系统时间,软件每次读取License文件内容,要求系统时间必须晚于软件注册时间。
  2. 授权码,授权码由CPU序列号,通过加密计算得出,授权码加密算法绝对保密。
  3. 更新时间,每次读取License文件内容,都要更新此字段,同时验证该时间必须大于软件注册时间,小于到期时间。
  4. 到期时间,软件到期时间,系统时间大于该时间后停止软件正常使用。

软件最终使用要求

1、用户根据软件说明书安装软件,启动软件后获取CPU序列号,提供管理员。 2、用户提供CPU序列号给管理员,管理员通过加密软件计算得到加密秘钥,同时生成License文件。提供两个内容给用户。 3、要求系统时间和网络时间必须同步。退出

参考资料

QT获取CPU序列号方式 来源

QString MainWindow::getWMIC(const QString &cmd)
{
    //获取cpu名称:wmic cpu get Name
    //获取cpu核心数:wmic cpu get NumberOfCores
    //获取cpu线程数:wmic cpu get NumberOfLogicalProcessors
    //查询cpu序列号:wmic cpu get processorid
    //查询主板序列号:wmic baseboard get serialnumber
    //查询BIOS序列号:wmic bios get serialnumber
    //查看硬盘:wmic diskdrive get serialnumber
    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;
}

QString MainWindow::getCpuName()
{
    return getWMIC("wmic cpu get name");
}

QString MainWindow::getCpuId()
{
    return getWMIC("wmic cpu get processorid");
}

QString MainWindow::getDiskNum()
{
    return getWMIC("wmic diskdrive where index=0 get serialnumber");
}}

C# 获取 CPUID 来源

string GetCpuID()
{
    try
    {
        string cpuInfo = "";//cpu序列号 
        ManagementClass mc = new ManagementClass("Win32_Processor");
        ManagementObjectCollection moc = mc.GetInstances();
        foreach (ManagementObject mo in moc)
        {
            cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
        }
        moc = null;
        mc = null;
        return cpuInfo;
    }
    catch
    {
        return "unknow";
    }
    finally
    {
    }
}
如果这篇文章对您很有帮助,不妨
----- 本文结束 ❤ 感谢您的阅读 ----