iOS轻舟网络验证 — 高级开发文档

版本 1.0 • 语言:Objective-C • 生成时间:2025-10-07 18:00
文档作者:
💡 后端部署教程 ⚙️ H5GG 接入

1. 概览

本模块(iOS轻舟网络验证)用于在 App 启动阶段对授权码进行本地 + 远程校验,并在成功后进入业务功能。支持防篡改、签名验真、时间窗校验(默认 300s),并提供可定制的成功回调接入位。

2. 架构与依赖

组件用途
commsec_guard.h防篡改/完整性检测
commsec.h封装加解密、HMAC(CommSec_EncryptPayload / Decrypt / HmacSha256Hex)
libcurl(或 NSURLSession)网络请求
cJSONJSON 解析与构造
CommonCryptoSHA-256/HMAC
UIKitAlert 与 UI 表达
建议:生产环境优先使用 NSURLSession。密钥放在混淆模块或通过后端下发;不要明文保存在仓库与 NSUserDefaults。

3. 核心流程图

App 启动(constructor) 读取缓存授权码 无→弹窗输入 / 有→自动验证 sig = HMAC(KEYS,""code|uuid|appid|appv|ts"") CommSec_EncryptPayload → POST 返回密文,解密并校验 校验时间窗±300s & 响应签名 uuid 一致 & sgin 一致 成功→缓存授权码→进入你的功能

4. 验证成功后:在哪里调用你的功能?

sub_19745_ex 成功分支中,标有 // TODO: 这里进入你的功能 的位置即为接入点。下面提供四种接入方式。

方案 A:直接调用固定函数

void EnterMainFeature(const char *expiry){
    NSString *exp = expiry ? [NSString stringWithUTF8String:expiry] : @"";
    NSLog(@"授权通过,到期:%@", exp);
}
EnterMainFeature(time1);

方案 B:协议/回调

@protocol ActivationHandler <NSObject>
- (void)activationDidSucceedWithExpiry:(NSString*)expiry;
@end
@interface AppDelegate () <ActivationHandler> @end
@implementation AppDelegate
- (void)activationDidSucceedWithExpiry:(NSString *)expiry {}
@end
id<ActivationHandler> h = (id<ActivationHandler>)[[UIApplication sharedApplication] delegate];
if([h respondsToSelector:@selector(activationDidSucceedWithExpiry:)]){
    [h activationDidSucceedWithExpiry:[NSString stringWithUTF8String:time1]];
}

方案 C:通知(NSNotificationCenter)

[[NSNotificationCenter defaultCenter] postNotificationName:@"ActivationDidSucceedNotification" object:nil userInfo:@{@"expiry":[NSString stringWithUTF8String:time1]}];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onActivation:) name:@"ActivationDidSucceedNotification" object:nil];
- (void)onActivation:(NSNotification*)n{
    NSString *exp = n.userInfo[@"expiry"];
}

方案 D:Block 回调(适合注入)

typedef void (^ActivationCallback)(NSString *expiry);
static ActivationCallback g_activation_cb = nil;
void SetActivationCallback(ActivationCallback cb){ g_activation_cb = [cb copy]; }
if(g_activation_cb) g_activation_cb([NSString stringWithUTF8String:time1]);
SetActivationCallback(^(NSString *expiry){});
函数名可改:以上示例名称可按你或客户规范重命名,只需在成功分支调用处保持一致。

5. 密钥混淆示例(清晰可复制)

建议:构建阶段完成混淆并写入源码或资源,运行时解混淆后立即使用并清理。

5.1 C:XOR 解混淆

#include <stdlib.h>
#include <string.h>
static const unsigned char OBFUSCATED_KEYS[] = {0x1f,0x2b,0x17,0x3a};
static const unsigned char XOR_KEY = 0x5A;
char *xor_deobfuscate(const unsigned char *data,size_t len,unsigned char key){
    char *out=(char*)malloc(len+1);
    if(!out) return NULL;
    for(size_t i=0;i<len;++i) out[i]=(char)(data[i]^key^(unsigned char)(i&0xFF));
    out[len]='\0';
    return out;
}

5.2 Objective-C:Base64 包裹 + XOR

#import <Foundation/Foundation.h>
static NSString * const kEncodedKey = @"R0hJS0JBS0J...";
NSString *RecoverKeysFromEncoded(void){
    NSData *b=[[NSData alloc]initWithBase64EncodedString:kEncodedKey options:0];
    if(!b) return nil;
    size_t len=b.length;
    const unsigned char *bytes=(const unsigned char *)b.bytes;
    NSMutableData *out=[NSMutableData dataWithLength:len];
    unsigned char xorKey=0x5A;
    for(size_t i=0;i<len;++i){
        unsigned char v=bytes[i]^xorKey^(unsigned char)(i&0xFF);
        ((unsigned char*)out.mutableBytes)[i]=v;
    }
    NSString *keys=[[NSString alloc]initWithData:out encoding:NSUTF8StringEncoding];
    memset(out.mutableBytes,0,len);
    return keys;
}
工程建议:在 CI 中用脚本读取明文 key,按字节混淆后写回源码模板,避免在版本库中出现明文。

6. 接口契约(摘要)

字段说明
code用户输入的授权码
uuid设备指纹(CommSec_GetDeviceId)
appid/appv软件代号/版本
ts秒级时间戳
sigHMAC_SHA256(KEYS,"code|uuid|appid|appv|ts")
auto是否静默验证("1":自动)
响应需同时通过:时间窗校验(±300s)、响应签名校验、uuid 一致、sgin(基于分钟的 SHA256)一致;满足 date=="99999"state=="success" 方可放行。

7. 集成步骤

  1. 引入 www.m/www.hcommsec 库,连接 libcurl 或替换为 NSURLSession
  2. Build Settings 添加 -ObjC;保持构造函数可执行。
  3. 修改常量(host/KEYS/XOR_KEY/appid/appv/TS_WINDOW)。
  4. 按第 4 节选择一种成功回调接法;函数名可自定义。
  5. 联调通过后把混淆/下发策略接入 CI 并加密发布。

8. 安全与合规

9.1 常见问题

为什么会提示“服务器时间无效”? 端到端时间差超过 300s;请提示用户校时或在失败时引导重试。

9.2 测试清单

  • 首次安装:需弹窗输入;失败后清缓存并重试。
  • 成功后重启:自动静默验证。
  • uuid 不一致:进入解绑提示分支。
  • 签名错误或超时:严格拒绝。