DeepSafe 网络验证 — API 对接文档

版本 2.1  |  服务地址 cli.deepsafe.top:29295  |  通信协议 HTTP GET  |  加密方式 AES-256-CBC

目录
  1. 架构概览
  2. 加密与通信规范
  3. 典型对接流程
  4. 接口列表
    1. 获取通知 — /deepsafeGetNotice
    2. 初始化项目 — /deepsafeloadcsh
    3. 卡密登录 — /deeosafeloadkhd
    4. 心跳维持 — /deepsafeHeart
    5. 卡密解绑 — /deepsafeUnbind
    6. 设备拉黑 — /deepsafeLBlocking
  5. 通用错误码
  6. 客户端示例 (C++)

1. 架构概览

DeepSafe 提供基于卡密的网络授权验证服务。客户端引入 DLL 后,通过 HTTP 与服务端交互完成登录、心跳、解绑等操作。

项目说明
服务地址cli.deepsafe.top(如需自定义请在 init() 中修改)
端口29295
传输方式HTTP GET,参数 URL-Encoded
加密算法AES-256-CBC,IV 全零
密钥派生MD5(password) × 2 扩展为 32 字节密钥
响应格式Base64(AES 密文) → 解密后为 JSON
防重放请求携带 TimeStemp(Unix 时间戳),服务端 ±10s 容差
防离线分析请求携带 Nonce(客户端生成的随机数),参与密钥派生

2. 加密与通信规范

2.1 请求格式

GET /{endpoint}?&key1=URL_ENCODE(val1)&key2=URL_ENCODE(val2)&Nonce={随机数} HTTP/1.1
Host: cli.deepsafe.top:29295

通用规则:

2.2 密钥派生

// 固定密钥 (构建时 VMProtect 加密,运行时解密)
string g_AESEncrypyKey = "DeepSafe";          // 实际项目请改为自定义值

// 密钥派生 (AESHelper)
MD5(g_AESEncrypyKey + Nonce)                   // → 16 字节
最终密钥 = MD5_Digest || MD5_Digest            // 复制拼接 → 32 字节
注意:服务端需要从 URL 中获取 Nonce,使用相同的派生逻辑生成解密密钥。

2.3 响应解密流程

HTTP Response Body (Base64 字符串)
    │
    ├─ Base64 Decode
    │      ↓
    ├─ AES-256-CBC Decrypt (key = 派生密钥, iv = 0×16)
    │      ↓
    └─ UTF-8 JSON 字符串 → json::parse()

3. 典型对接流程

① 初始化
/deepsafeloadcsh
② 获取公告
/deepsafeGetNotice
③ 用户输入卡密
点击登录
④ 卡密登录
/deeosafeloadkhd
⑤ 启动心跳线程
/deepsafeHeart (每60s)

可选操作:解绑/deepsafeUnbind  |  拉黑设备/deepsafeLBlocking

4. 接口列表

4.1 获取项目通知

GET /deepsafeGetNotice
参数类型必填说明
userstring开发者用户名
rjmstring项目名称 (软件名)

成功响应 JSON:

{
  "result": ["Succeed"],
  "cause":  ["这是一条公告内容,支持 UTF-8 中文"]
}

该接口用于在登录界面展示项目公告,无加密或使用通用密钥加密。

4.2 初始化项目

GET /deepsafeloadcsh
参数类型必填说明
UserNamestring开发者用户名
ProjectNamestring项目名称
VersionNumberstring版本号
deviceKeystring机器码 (MAC+CPU)
QQhstring当前登录的 QQ 号

成功响应 JSON:

{
  "code":   ["100"],
  "result": ["Succeed"],
  "state":  ["网络验证"]       // ← 此字段经过 URL-Encode,需 url_decode()
}

state 取值含义:

含义
网络验证正常验证模式
单线模式单线授权模式
云保护壳加壳保护模式
停用项目已停用

错误码:

code含义
101账户授权或验证已到期
102版本已禁用
400该设备已封禁
401设备已过期
403设备已冻结
重要:返回的 state 字段经过 URL-Encode,客户端必须调用 url_decode() 后再比对。

4.3 卡密登录

GET /deeosafeloadkhd
参数类型必填说明
userstring开发者用户名
usernamestring项目名称
kmstring卡密
jqmstring机器码 (MAC+CPU)
hQQstringQQ 号
TimeStempintUnix 时间戳 (秒),服务端 ±10s 防重放

成功响应 JSON:

{
  "code":      ["100"],
  "result":    ["succeed"],
  "EndTime":   ["2026-12-31 23:59:59"],
  "TimeStemp": ["1714200000"],
  "SafeKey":   ["94041a"],
  "CheckKey":  ["8e044c"]
}
校验逻辑
  1. 检查 |当前时间 - TimeStemp| ≤ 10s(防重放),否则退出进程
  2. 对比 SafeKey 与本地编译时嵌入的 g_SafeKey 是否一致
  3. 对比 CheckKey 与本地编译时嵌入的 g_CheckKey 是否一致
  4. 任一项不匹配 → 调用 /deepsafeLBlocking 拉黑设备并提示"非法修改程序文件"

错误码:

code含义
101卡密已过期
102卡密不一致(不属于该项目)
103账号已封禁
104卡密不存在
303QQ 号不匹配

4.4 心跳维持

GET /deepsafeHeart
参数类型必填说明
userstring开发者用户名
kmstring登录成功的卡密
deviceKeystring机器码
rjmstring项目名称

调用频率:每 60 秒一次  |  容错:连续失败 3 次后退出进程

成功响应 JSON:

{
  "code": ["100"]
}

错误码:

code触发动作含义
101结束心跳回调 → 弹窗 → 退出卡密不存在
102弹窗 → 退出卡密被禁用
103结束心跳回调 → 弹窗 → 退出卡密不一致
104结束心跳回调 → 弹窗 → 退出卡密已到期
105结束心跳回调 → 弹窗 → 退出项目已停用
对接注意:心跳失败后需要调用 DLL 宿主程序的 EndCallback 导出函数,然后再退出进程。连续失败 3 次(即 3 分钟内均失败)触发强制退出。

4.5 卡密解绑

GET /deepsafeUnbind
参数类型必填说明
userstring开发者用户名
kmstring要解绑的卡密
rjmstring项目名称

成功响应 JSON:

{
  "result": ["Succeed"],
  "cause":  [""]
}

解绑成功后,该卡密可在其他设备上重新登录。

4.6 设备拉黑

GET /deepsafeLBlocking
参数类型必填说明
userstring开发者用户名
devstring项目名称
kmstring当前登录的卡密
causestring拉黑原因(如:非法修改程序文件)

成功响应:

okay
触发时机:登录过程中检测到 SafeKeyCheckKey 不匹配时自动调用,用于标记设备为非法状态。

5. 通用错误码汇总

code出现接口含义
100全部操作成功
101登录 / 心跳 / 初始化过期 — 卡密已过期 或 账户授权到期
102登录 / 心跳 / 初始化禁用 — 卡密/版本被禁用 或 卡密不一致
103登录 / 心跳封禁 — 账号已封禁 或 卡密不一致
104登录 / 心跳不存在 / 到期 — 卡密不存在或已到期
105心跳项目已停用
303登录QQ 号不匹配
400初始化该设备已封禁
401初始化设备已过期
403初始化设备已冻结

6. 客户端接入示例 (C++)

6.1 初始化与全局配置

// init() — DLL 入口调用
void init(HMODULE hModule) {
    // 项目配置 (编译时由一键加验证客户端注入)
    g_UserName      = "Admins";
    g_ProjectName   = "深度云授权";
    g_SafeKey       = "94041a";
    g_CheckKey      = "8e044c";
    VersionNumber   = "10";

    // 收集设备信息
    QQ     = GetQQ_Plus();       // 获取当前登录的 QQ 号
    机器码  = GetMachineID();     // MAC + CPU 序列号

    // 初始化校验
    if (!GetInitrRequst()) {
        ExitProcess(0);
    }

    // 显示登录窗口 → 启动心跳线程
    LoadWindow();
    std::thread t(HeartThreat);
    t.detach();
}

6.2 构建请求 URL(推荐封装)

// 生成随机 Nonce
int GenerateNonce() {
    unsigned int n;
    HCRYPTPROV hProv;
    CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
    CryptGenRandom(hProv, sizeof(n), (BYTE*)&n);
    CryptReleaseContext(hProv, 0);
    return n;
}

// 构建 URL: path?&key1=urlencode(val1)&key2=urlencode(val2)&Nonce=xxx
static string BuildUrl(const string& path,
                       const vector<pair<string, string>>& params) {
    string url = path + "?";
    for (auto& p : params) {
        url += "&" + p.first + "=" + url_encode(p.second);
    }
    return url += "&Nonce=" + to_string(GenerateNonce());
}

// 发送 GET 并解密响应
static string GetDecrypt(const string& url) {
    auto res = cli.Get(url);
    if (!res || res->status != 200) return "";
    return E_AES256_Decrypt(res->body.c_str(), g_AESEncrypyKey);
}

6.3 调用示例

// 获取公告
string notice = GetDecrypt(BuildUrl("/deepsafeGetNotice", {
    {"user", g_UserName},
    {"rjm",  g_ProjectName}
}));

// 卡密登录
string result = GetDecrypt(BuildUrl("/deeosafeloadkhd", {
    {"user",     g_UserName},
    {"username", g_ProjectName},
    {"km",       卡密},
    {"jqm",      机器码},
    {"hQQ",      QQ},
    {"TimeStemp", to_string(time(nullptr))}
}));

// 心跳
string heart = GetDecrypt(BuildUrl("/deepsafeHeart", {
    {"user",      g_UserName},
    {"km",        LoginKey},
    {"deviceKey", 机器码},
    {"rjm",       g_ProjectName}
}));

// 解绑
string unbind = GetDecrypt(BuildUrl("/deepsafeUnbind", {
    {"user", g_UserName},
    {"km",   卡密},
    {"rjm",  g_ProjectName}
}));
完整代码:参见项目中的 验证.cpp

DeepSafe Network Authentication © 2026