← 返回首页 📖 开发文档

一、系统概述

云盾网络验证系统 是一款功能强大的网络验证系统,提供安全、可靠的软件授权验证服务。 系统采用先进的双端加密传输方案,确保您的软件授权数据在传输过程中绝对安全。

核心特性

  • AES-256-CBC 对称加密 - 高效的大流量数据加密
  • RSA-2048 非对称加密 - 安全密钥分发与数字签名
  • HMAC-SHA256 签名 - 数据完整性校验与防篡改
  • 时间戳防重放 - 杜绝中间人攻击与重放攻击
  • 一机一码绑定 - 卡密与设备绑定,防止共享
  • 多类型卡密 - 时长卡、次数卡、永久卡
  • 代理系统 - 支持代理销售卡密

系统架构

系统采用统一API入口设计,所有验证接口通过 /api/index.php 接收请求。 客户端通过携带 app_key 标识自己的应用身份,并通过加密方式传递敏感参数。

二、快速开始

第一步:注册开发者账号

在网站注册页面选择"开发者"角色并注册账号。

第二步:创建应用

登录控制台后,在"应用管理"页面点击"创建应用"。 系统将自动生成:

  • AppKey - 应用的唯一标识
  • AppSecret - 应用密钥(用于HMAC签名)
  • RSA密钥对 - 用于加密通信的公钥/私钥对
⚠️ 注意:AppSecret 和 RSA私钥非常重要,请妥善保管,不要泄露。私钥是加密通信的关键。

第三步:生成卡密

在"卡密管理"页面选择应用,设置卡密类型(时长卡/次数卡/永久卡),生成批量卡密。

第四步:集成SDK

根据您的开发语言选择对应的SDK示例进行集成。 核心流程是:客户端启动 → 调用验证接口 → 获取授权结果 → 根据结果控制软件功能。

三、加密方案

系统采用三层加密防护体系,同时使用对称加密和非对称加密,确保数据传输的安全性。

加密模式

模式描述安全性
0明文传输(仅调试用)
1AES对称加密
2AES+RSA混合加密(推荐)

混合加密流程

  1. 客户端生成随机会话密钥 (AES Key, 32字节)
  2. 使用RSA公钥加密会话密钥
  3. 使用AES密钥加密请求数据
  4. 使用HMAC-SHA256对密文生成签名
  5. {key, data, sign} 打包发送给服务端
  6. 服务端使用RSA私钥解密出会话密钥
  7. 验证HMAC签名确认数据完整性
  8. 使用AES密钥解密获取明文数据
💡 混合加密的优势:RSA加密会话密钥(安全),AES加密实际数据(高效),两者兼顾安全性和性能。

四、接口认证

所有API请求需要通过 app_key 参数标识应用身份。

请求URL

URL
POST https://your-domain.com/api/index.php

GET  https://your-domain.com/api/index.php?action=verify

公共参数

参数必填说明
app_key应用唯一标识,在控制台获取
action接口名称(verify/heartbeat等)
data加密的请求数据(JSON字符串)

五、卡密验证接口

接口说明

验证卡密有效性,首次验证会绑定机器码,返回授权Token。

POST
POST /api/index.php

参数:
- app_key:      应用Key
- action:       verify
- data:         加密数据(包含card_no, card_pwd, machine_code)

请求数据 (加密前)

JSON
{
    "card_no": "YD01-ABCD-EFGH-IJKL-MNOP",
    "card_pwd": "AB23CD45",
    "machine_code": "9F8E-4D2C-...",
    "version": "1.0.0",
    "os_info": "Windows 10"
}

响应

JSON
{
    "code": 200,
    "msg": "验证成功",
    "data": {
        "software": "我的软件",
        "expire_time": 1735603200,
        "expire_text": "2025-01-01 00:00:00",
        "remain_count": -1,
        "card_type": 1,
        "card_type_text": "时长卡",
        "notice": "欢迎使用",
        "version": "1.0.0"
    },
    "token": "a1b2c3d4e5f6...",
    "timestamp": 1735600000
}

六、心跳检测接口

验证成功后,客户端需要定期发送心跳保持在线状态。心跳间隔建议为30秒。

POST
POST /api/index.php

参数:
- app_key:     应用Key
- action:      heartbeat
- token:       验证时返回的Token
- data:        加密数据(包含machine_code, version等信息)
💡 如果心跳超时超过设定值(默认120秒),服务端会标记该设备离线。

七、其他接口

退出登录 (logout)

客户端退出时调用,清除在线状态。

POST
参数:
- app_key: 应用Key
- action:  logout
- token:   验证时返回的Token

获取公告 (getNotice)

获取应用的公告内容。

POST
参数:
- app_key: 应用Key
- action:  getNotice

版本检查 (getVersion)

检查是否有新版本。

POST
参数:
- app_key: 应用Key
- action:  getVersion

查询授权信息 (info)

查询当前设备的授权状态。

POST
参数:
- app_key:      应用Key
- action:       info
- token:        授权Token
- machine_code: 设备机器码

八、错误码对照表

错误码说明
200成功
-1缺少action参数
-2缺少app_key参数
-3AppKey无效或应用已停用
-4IP已被拉黑
-5设备已被拉黑
-6数据解密失败
-7加密数据解密失败
1001卡号不能为空
1002机器码不能为空
1003卡号不存在
1004卡密已被禁用
1005卡密已过期
1006卡密密码错误
1007该卡密已绑定其他设备
1008授权已过期
1009卡密次数已用完
1010卡密已被使用
2001缺少token参数
2002token无效或已失效
4001缺少token参数
4002缺少machine_code参数
4003授权不存在或已失效
4004授权已过期

九、Python 对接示例

使用Python requests库对接云盾验证API。

Python
import requests
import hashlib
import hmac
import json
import time

# 配置
API_URL = "http://your-domain.com/api/index.php"
APP_KEY = "AKXXXXXXXXXXXX"
APP_SECRET = "YOUR_APP_SECRET"
RSA_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"

def get_machine_code():
    """获取机器码"""
    import platform
    return platform.node()  # 简化示例,实际可生成设备唯一标识

def verify_card(card_no, card_pwd):
    """验证卡密"""
    data = {
        'card_no': card_no,
        'card_pwd': card_pwd,
        'machine_code': get_machine_code(),
        'version': '1.0.0',
        'os_info': 'Python Client'
    }
    # 发送请求(此处演示明文模式,正式使用请加密)
    resp = requests.post(API_URL, data={
        'app_key': APP_KEY,
        'action': 'verify',
        'data': json.dumps(data)
    })
    result = resp.json()
    return result

def heartbeat(token):
    """心跳检测"""
    resp = requests.post(API_URL, data={
        'app_key': APP_KEY,
        'action': 'heartbeat',
        'token': token,
    })
    return resp.json()

# 示例用法
if __name__ == '__main__':
    card_no = input("输入卡号: ")
    card_pwd = input("输入卡密: ")
    result = verify_card(card_no, card_pwd)
    if result['code'] == 200:
        print("✅ 验证成功!")
        print("剩余时间:", result['data']['expire_text'])
        print("Token:", result['token'])
        # 持续心跳
        import threading
        def heart():
            while True:
                heartbeat(result['token'])
                time.sleep(30)
        t = threading.Thread(target=heart, daemon=True)
        t.start()
        # 主程序运行...
    else:
        print("❌ 验证失败:", result['msg'])

十、C# 对接示例

使用C# HttpClient对接云盾验证API。

C#
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

public class AuthClient
{
    private static readonly HttpClient client = new HttpClient();
    private const string API_URL = "http://your-domain.com/api/index.php";
    private const string APP_KEY = "AKXXXXXXXXXXXX";
    private const string APP_SECRET = "YOUR_APP_SECRET";

    public async Task VerifyCard(string cardNo, string cardPwd)
    {
        var data = new
        {
            card_no = cardNo,
            card_pwd = cardPwd,
            machine_code = GetMachineCode(),
            version = "1.0.0",
            os_info = "Windows"
        };

        var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair("app_key", APP_KEY),
            new KeyValuePair("action", "verify"),
            new KeyValuePair("data", JsonConvert.SerializeObject(data))
        });

        var response = await client.PostAsync(API_URL, content);
        var json = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject(json);
    }

    public async Task Heartbeat(string token)
    {
        var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair("app_key", APP_KEY),
            new KeyValuePair("action", "heartbeat"),
            new KeyValuePair("token", token)
        });
        var resp = await client.PostAsync(API_URL, content);
        var json = await resp.Content.ReadAsStringAsync();
        dynamic result = JsonConvert.DeserializeObject(json);
        return result.code == 200;
    }

    private string GetMachineCode()
    {
        // 获取机器码逻辑
        return Environment.MachineName + "-" + Environment.ProcessorCount;
    }
}

public class AuthResult
{
    public int code { get; set; }
    public string msg { get; set; }
    public string token { get; set; }
    public AuthData data { get; set; }
}

public class AuthData
{
    public string software { get; set; }
    public long expire_time { get; set; }
    public string expire_text { get; set; }
    public int remain_count { get; set; }
    public int card_type { get; set; }
    public string notice { get; set; }
}

十一、PHP 对接示例

使用PHP cURL对接云盾验证API。

PHP
<?php
// 云盾网络验证系统 - PHP客户端示例

$apiUrl = 'http://your-domain.com/api/index.php';
$appKey = 'AKXXXXXXXXXXXX';
$appSecret = 'YOUR_APP_SECRET';

// 获取机器码
function get_machine_code() {
    return md5(php_uname('n') . php_uname('m'));
}

// 调用API
function call_api($action, $params = []) {
    global $apiUrl, $appKey;
    $params['app_key'] = $appKey;
    $params['action'] = $action;
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    curl_close($ch);
    return json_decode($result, true);
}

// 验证卡密
function verify_card($card_no, $card_pwd) {
    return call_api('verify', [
        'card_no' => $card_no,
        'card_pwd' => $card_pwd,
        'machine_code' => get_machine_code(),
        'version' => '1.0.0',
        'os_info' => 'PHP Client'
    ]);
}

// 心跳检测
function heartbeat($token) {
    return call_api('heartbeat', ['token' => $token]);
}

// 使用示例
$result = verify_card('YD01-ABCD-EFGH-IJKL-MNOP', 'AB23CD45');
if ($result['code'] == 200) {
    echo "✅ 验证成功,授权至: " . $result['data']['expire_text'] . PHP_EOL;
    $token = $result['token'];
    // 定期发送心跳...
    echo heartbeat($token)['msg'];
} else {
    echo "❌ " . $result['msg'];
}
?>