You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++控制台应用连接MySQL实现登录系统及HWID绑定方法咨询

C++控制台实现MySQL登录+HWID绑定实现步骤

前置环境准备

  • 先安装MySQL社区版服务端,安装过程牢记自己设置的root账号密码。安装完成后把MySQL安装目录下的include文件夹加入C++项目的附加包含目录,lib文件夹加入附加库目录,链接器输入项中添加libmysql.lib依赖,最后把libmysql.dll复制到编译生成的exe同目录,否则程序启动会报缺失dll的错误。
  • 初学者直接用MySQL官方C API即可,别一开始就折腾各种封装好的重型ORM库,光配环境就能卡大半天,先把基础逻辑跑通再考虑优化。

第一步:创建数据库和用户表

先在MySQL客户端执行以下SQL语句建库建表,表结构直接满足登录和HWID存储需求:

CREATE DATABASE IF NOT EXISTS demo_login;
USE demo_login;
CREATE TABLE IF NOT EXISTS users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(32) UNIQUE NOT NULL,
    passwd_hash VARCHAR(64) NOT NULL,
    hwid VARCHAR(128) DEFAULT NULL,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

注意:绝对不要明文存储用户密码,所有密码存库前先计算SHA256哈希,就算数据库泄露也不会直接暴露用户真实密码。

第二步:实现本地HWID获取函数

先封装一个std::string get_local_hwid()函数,返回当前设备的唯一标识字符串:

注:HWID不需要做到100%防伪造,基础账号绑定场景下只要能区分普通用户设备即可,真要对抗恶意破解需要加壳、服务端动态校验等额外逻辑,初学者先实现基础功能即可,不用一开始就追求防破解强度。
Windows平台下简单实现即可:组合调用系统API取系统盘卷序列号、网卡MAC地址、CPU序列号,把三个特征字符串拼接后再算一次MD5/SHA256,生成固定长度的字符串作为HWID,避免单个特征被轻易修改绕过。

第三步:封装MySQL基础操作

不用做复杂封装,先实现三个基础能力即可:

  • 数据库连接函数:初始化连接句柄,连接本地MySQL的demo_login库,连接失败直接打印错误信息返回false,程序退出前记得关闭连接释放资源。
  • 预处理查询能力:所有涉及用户输入的SQL操作必须用预处理语句,绝对不要直接把用户输入的用户名、密码拼接到SQL字符串里,否则会被SQL注入直接绕过校验(比如用户名输入' OR 1=1 --就能无密码登录)。
    以下是预处理查询的核心逻辑示例,补全错误判断就能用:
MYSQL_STMT* stmt = mysql_stmt_init(mysql_conn);
const char* query_sql = "SELECT passwd_hash, hwid FROM users WHERE username = ?";
mysql_stmt_prepare(stmt, query_sql, strlen(query_sql));
// 绑定用户输入的用户名作为查询参数
MYSQL_BIND input_param[1];
memset(input_param, 0, sizeof(input_param));
input_param[0].buffer_type = MYSQL_TYPE_STRING;
input_param[0].buffer = (void*)input_username.c_str();
input_param[0].buffer_length = input_username.size();
mysql_stmt_bind_param(stmt, input_param);
mysql_stmt_execute(stmt);
// 绑定查询结果,把数据库中存储的密码哈希、HWID读到本地变量
MYSQL_BIND output_res[2];
// 补全输出参数绑定逻辑
mysql_stmt_fetch(stmt);
mysql_stmt_close(stmt);
  • 预处理更新能力:用于首次登录时更新用户绑定的HWID,同样用预处理语句,不要拼接字符串。

第四步:登录校验+HWID绑定核心流程

整个流程按顺序执行即可:

  1. 程序启动先调用数据库连接函数,连不上直接打印错误退出。
  2. 控制台打印提示,读取用户输入的用户名、密码。
  3. 对用户输入的密码计算SHA256哈希,用预处理语句查询对应用户名在数据库中存储的密码哈希,两者不一致就提示“用户名或密码错误”,回到输入步骤。
  4. 密码校验通过后,判断查询到的该用户HWID字段是否为空:
    • 若为空:说明是账号首次登录,调用get_local_hwid()拿到当前设备HWID,用预处理更新语句把HWID写入该用户的记录,提示“首次登录已绑定当前设备”,直接进入后续业务代码逻辑。
    • 若不为空:把本地获取的HWID和数据库存储的HWID做精确字符串比对,比对一致则进入后续业务代码,比对不一致直接提示“当前设备未绑定该账号,禁止登录”,退出程序。
  5. 如果需要注册功能,额外加注册逻辑即可:读取用户输入的新用户名、两次确认密码,校验用户名未重复、两次密码一致后,把密码哈希存入数据库,HWID字段留空即可。

初学者常见踩坑点

  • 编译时注意库的版本匹配:32位编译就用32位的MySQL库文件,64位编译就用64位的,否则会报链接错误。
  • 控制台读取用户输入时记得清空输入缓冲区,避免读入的字符串带多余换行、空格,导致校验失败。
  • 不要每次执行SQL都新建数据库连接且不释放,运行时间长了会占满MySQL的最大连接数,导致后续连接失败。
  • 密码哈希不要自己写加密算法,直接调用系统自带的加密API或者成熟的开源实现算SHA256,自己写的简易哈希很容易被撞库破解。

内容的提问来源于stack exchange,提问作者luckioo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:51:18