分布式软总线认证模块架构与实现分析

发布时间:2026/9/12 4:38:33

分布式软总线认证模块架构与实现分析 一、整体架构概述软总线认证模块是OpenHarmony分布式通信的核心安全组件位于foundation/communication/dsoftbus/core/authentication/目录下。该模块基于HiChain安全认证框架实现了设备间的双向身份认证和会话密钥协商。二、认证管理器 (AuthManager)2.1 核心数据结构auth_manager.h:L18-L33typedef struct { int64_t authId; // 认证唯一标识 bool isServer; // 角色标志(服务器/客户端) uint64_t connId[AUTH_LINK_TYPE_MAX]; // 各链路连接ID AuthConnInfo connInfo[AUTH_LINK_TYPE_MAX]; // 连接信息 int64_t lastAuthSeq[AUTH_LINK_TYPE_MAX]; // 最近认证序列 SessionKeyList sessionKeyList; // 会话密钥列表 char udid[UDID_BUF_LEN]; // 设备唯一标识 char uuid[UUID_BUF_LEN]; // UUID SoftBusVersion version; // 协议版本 bool hasAuthPassed[AUTH_LINK_TYPE_MAX]; // 各链路认证状态 } AuthManager;2.2 关键管理接口创建认证管理器-NewAuthManager()根据authSeq和会话信息创建新的AuthManager实例客户端加入g_authClientList服务器加入g_authServerList初始化会话密钥列表删除认证管理器-DelAuthManager()支持按链路类型删除(type参数)仅删除单个链路时保留其他链路连接全部链路都无连接时才完全释放资源会话密钥管理AuthManagerSetSessionKey()- 设置会话密钥AuthManagerGetSessionKey()- 获取会话密钥RemoveAuthSessionKeyByIndex()- 按索引删除密钥2.3 双链表组织结构auth_manager.c:L45-L46static ListNode g_authClientList { g_authClientList, g_authClientList }; static ListNode g_authServerList { g_authServerList, g_authServerList };三、认证会话与状态机 (AuthSessionFsm)3.1 状态机定义auth_session_fsm.h:L24-L30typedef enum { STATE_SYNC_NEGOTIATION 0, // 协商阶段 STATE_SYNC_DEVICE_ID, // 设备ID同步 STATE_DEVICE_AUTH, // 设备认证(HiChain) STATE_SYNC_DEVICE_INFO, // 设备信息同步 STATE_NUM_MAX } AuthFsmStateIndex;3.2 状态转换图3.3 状态处理函数auth_session_fsm.c:L75-L99static FsmState g_states[STATE_NUM_MAX] { [STATE_SYNC_NEGOTIATION] { .enter SyncNegotiationEnter, .process SyncNegotiationStateProcess, .exit NULL, }, [STATE_SYNC_DEVICE_ID] { .enter SyncDevIdStateEnter, .process SyncDevIdStateProcess, .exit NULL, }, [STATE_DEVICE_AUTH] { .enter DeviceAuthStateEnter, .process DeviceAuthStateProcess, .exit NULL, }, [STATE_SYNC_DEVICE_INFO] { .enter NULL, .process SyncDevInfoStateProcess, .exit NULL, }, };3.4 消息类型定义auth_session_fsm.c:L36-L51typedef enum { FSM_MSG_RECV_DEVICE_ID, // 接收设备ID FSM_MSG_RECV_AUTH_DATA, // 接收认证数据 FSM_MSG_RECV_TEST_AUTH_DATA, // 接收测试数据 FSM_MSG_SAVE_SESSION_KEY, // 保存会话密钥 FSM_MSG_AUTH_ERROR, // 认证错误 FSM_MSG_RECV_DEVICE_INFO, // 接收设备信息 FSM_MSG_RECV_CLOSE_ACK, // 接收关闭确认 FSM_MSG_AUTH_FINISH, // 认证完成 FSM_MSG_AUTH_TIMEOUT, // 认证超时 FSM_MSG_DEVICE_NOT_TRUSTED, // 设备不可信 FSM_MSG_DEVICE_DISCONNECTED, // 设备断开 FSM_MSG_STOP_AUTH_FSM, // 停止认证 } StateMessageType;3.5 认证会话信息结构auth_session_fsm.h:L53-L82typedef struct { uint32_t requestId; bool isServer; uint64_t connId; AuthConnInfo connInfo; char udid[UDID_BUF_LEN]; char uuid[UUID_BUF_LEN]; char udidHash[SHA_256_HEX_HASH_LEN]; SoftBusVersion version; bool isSupportFastAuth; // 支持快速认证 bool isNeedFastAuth; // 需要快速认证 NormalizedType normalizedType; // 标准化类型 SessionKey *normalizedKey; // 标准化密钥 int64_t normalizedIndex; // 标准化索引 AuthStartState localState; // 本地认证状态 AuthStartState peerState; // 对方认证状态 // ... } AuthSessionInfo;四、设备认证 (AuthDevice)4.1 设备认证核心功能auth_device.h:L19-L32int32_t AuthDevicePostTransData(AuthHandle authHandle, const AuthTransData *dataInfo); int32_t AuthDeviceEncrypt(AuthHandle *authHandle, const uint8_t *inData, uint32_t inLen, ...); int32_t AuthDeviceDecrypt(AuthHandle *authHandle, const uint8_t *inData, uint32_t inLen, ...); int32_t AuthDeviceGetConnInfo(AuthHandle authHandle, AuthConnInfo *connInfo); void AuthDeviceNotTrust(const char *udid); // 标记设备不可信 int32_t AuthDirectOnlineCreateAuthManager(int64_t authSeq, const AuthSessionInfo *info);4.2 认证限制机制auth_device.c:L22-L90设备认证失败后会触发限制机制防止频繁重试#define DELAY_AUTH_TIME (8 * 1000L) // 8秒延迟 void AuthAddNodeToLimitMap(const char *udid, int32_t reason) { // 当reason为以下情况时加入限制map // - SOFTBUS_AUTH_HICHAIN_LOCAL_IDENTITY_NOT_EXIST // - SOFTBUS_AUTH_HICHAIN_GROUP_NOT_EXIST // - SOFTBUS_AUTH_HICHAIN_NO_CANDIDATE_GROUP } bool IsNeedAuthLimit(const char *udidHash) { // 检查限制map如果在8秒内则延迟认证 }五、HiChain安全认证5.1 HiChain概述HiChain是设备认证的核心安全协议栈基于PAKE(Password-Authenticated Key Exchange)协议族实现支持P2P认证设备间直接认证账户认证支持华为账号体系Mesh认证多设备组网认证5.2 核心接口auth_hichain.h:L20-L40int32_t HichainStartAuth(int64_t authSeq, const char *udid, const char *uid, int32_t userId); int32_t HichainProcessData(int64_t authSeq, const uint8_t *data, uint32_t len); void HichainCancelRequest(int64_t authReqId);5.3 PAKE协议实现pake_server.h:L20-L80struct pake_server { struct key_agreement_server server_info; uint32_t key_length; struct hc_pin pin; struct hc_salt salt; struct hc_auth_id self_id; struct hc_auth_id peer_id; struct esk self_esk; // 临时私钥 struct pake_session_key session_key; // 会话密钥 struct pake_hmac_key hmac_key; // HMAC密钥 struct hc_session_key service_key; // 服务密钥 // ... };5.4 HiChain回调机制auth_hichain.c:L55-L90static bool OnTransmit(int64_t authSeq, const uint8_t *data, uint32_t len) { // 将数据通过AuthSessionPostAuthData发送到对端 } static void OnSessionKeyReturned(int64_t authSeq, const uint8_t *sessionKey, uint32_t sessionKeyLen) { // 密钥协商成功后保存会话密钥 (void)AuthSessionSaveSessionKey(authSeq, sessionKey, sessionKeyLen); } static void OnFinish(int64_t authSeq, int operationCode, const char *returnData) { // 认证完成处理 (void)AuthSessionHandleAuthFinish(authSeq); }5.5 错误码转换auth_hichain.c:L110-L135HiChain错误码转换为SoftBus错误码#define HICHAIN_DAS_ERRCODE_MIN 0xF0000001 #define HICHAIN_DAS_ERRCODE_MAX 0xF00010FF #define HICHAIN_COMMON_ERRCODE_MIN 0x0001 #define HICHAIN_COMMON_ERRCODE_MAX 0xFFFF void GetSoftbusHichainAuthErrorCode(uint32_t hichainErrCode, uint32_t *softbusErrCode) { // 根据错误码范围进行转换 }六、认证连接 (AuthConnection)6.1 连接管理结构auth_connection.h:L15-L35typedef struct { void (*onConnectResult)(uint32_t requestId, uint64_t connId, int32_t result, const AuthConnInfo *connInfo); void (*onDisconnected)(uint64_t connId, const AuthConnInfo *connInfo); void (*onDataReceived)(uint64_t connId, const AuthConnInfo *connInfo, bool fromServer, const AuthDataHead *head, const uint8_t *data); } AuthConnListener;6.2 连接ID生成auth_connection.c:L65-L75uint64_t GenConnId(int32_t connType, int32_t id) { uint64_t connId (uint64_t)connType; connId (connId INT32_BIT_NUM) MASK_UINT64_H32; connId | (((uint64_t)id) MASK_UINT64_L32); return connId; }6.3 支持的链路类型auth_common.h:L18-L30typedef enum { DATA_TYPE_AUTH 0xFFFF0001, // 设备认证数据 DATA_TYPE_DEVICE_INFO 0xFFFF0002, // 设备信息同步 DATA_TYPE_DEVICE_ID 0xFFFF0003, // 设备ID同步 DATA_TYPE_CONNECTION 0xFFFF0004, // 连接数据 DATA_TYPE_CLOSE_ACK 0xFFFF0005, // 关闭确认 DATA_TYPE_META_NEGOTIATION 0xFFFF0006, // Meta协商 DATA_TYPE_DECRYPT_FAIL 0xFFFF0007, // 解密失败 DATA_TYPE_META_DEVICE_INFO_ACK 0xFFFF0008, DATA_TYPE_CANCEL_AUTH 0xFFFF0009, } AuthDataType;6.4 数据收发流程ConnectAuthDevice() // 建立认证连接 PostAuthData() // 发送认证数据 AuthConnListener // 回调通知连接结果和数据接收七、Meta认证与PTK7.1 Meta认证管理auth_meta_manager.h:L18-L35int32_t AuthMetaInit(const AuthTransCallback *callback); int32_t AuthMetaStartVerify(uint32_t connectionId, const AuthKeyInfo *authKeyInfo, uint32_t requestId, int32_t callingPid, const AuthVerifyCallback *callBack); void AuthMetaReleaseVerify(int64_t authId); int32_t AuthMetaEncrypt(int64_t authId, const uint8_t *inData, uint32_t inLen, ...); int32_t AuthMetaDecrypt(int64_t authId, const uint8_t *inData, uint32_t inLen, ...);7.2 PTK处理流程auth_meta_ptk_proc.h:L18-L30int32_t AuthGetPtkSyncInfoByAuthId(int64_t authId, bool *syncDone, int32_t *reason); int32_t AuthAddPtkSyncInfoForPendingList(AuthHandle authHandle, const NodeInfo *nodeInfo); int32_t AuthDelPtkSyncInfoFromPendingList(int64_t authId); int32_t AuthWaitingRequestCallback(int64_t authId); int32_t UpdateAuthSyncPtkInfoStatus(int64_t authId); int64_t GetAuthIdFromAuthSyncPtkInfo(const char *uuid);7.3 PTK同步状态Meta认证中的PTK(Peer Transaction Key)同步机制八、认证流程时序图九、关键安全特性9.1 密钥长度与算法PAKE密钥长度16字节(128位) - auth_hichain.c:L28会话密钥长度16字节 - pake_server.h:L26支持快速认证通过normalizedKey实现无PAKE协商的快速认证9.2 认证超时机制认证总超时30秒 - auth_common.c:L52各状态超时处理协商/设备ID同步超时 →SOFTBUS_AUTH_SYNC_DEVICEID_TIMEOUT设备认证超时 →SOFTBUS_AUTH_HICHAIN_TIMEOUT设备信息同步超时 →SOFTBUS_AUTH_SYNC_DEVICEINFO_TIMEOUT9.3 并发认证控制AddConcurrentAuthRequest()- 添加并发认证请求同一UDID的多个认证请求会被队列管理十、总结软总线认证模块采用分层架构设计层级组件职责管理层AuthManager维护已认证设备的会话和状态会话层AuthSessionFsm管理认证流程的4状态状态机协议层HiChainPAKE协议实现安全密钥协商连接层AuthConnection底层连接和数据传输Meta层AuthMetaManager元认证和PTK管理该设计实现了多链路统一认证支持WiFi/BLE/P2P等多种链路快速认证通过normalizedKey跳过PAKE协商安全可靠基于PAKE协议族提供身份认证和密钥协商高可用支持并发认证请求和超时重试机制
延伸阅读

更多相关文章

2026/9/12 4:37:57

SGLang多模态推理引擎:企业级AI应用的高性能解决方案

SGLang多模态推理引擎:企业级AI应用的高性能解决方案 【免费下载链接】sglang SGLang is a high-performance serving framework for large language models and multimodal models. 项目地址: https://gitcode.com/GitHub_Trending/sg/sglang 在当今企业AI应…

2026/9/8 10:57:11

Wealthfolio:本地优先投资追踪的终极解决方案

Wealthfolio:本地优先投资追踪的终极解决方案 【免费下载链接】wealthfolio A beautiful, private, local-first personal finance tracker. Investments, net worth, spending, and simulations. 项目地址: https://gitcode.com/GitHub_Trending/we/wealthfolio …

2026/9/12 4:34:47

Java StringEntry接口设计与实现最佳实践

1. StringEntry接口的设计背景与核心诉求在软件开发中,数据结构的抽象与封装一直是提升代码复用性和可维护性的关键手段。StringEntry这个接口概念的提出,本质上是为了解决字符串类型数据在多种场景下的统一操作问题。我最近在重构一个历史遗留系统时&am…

2026/9/12 4:34:47

海光DCU接入K8s:整卡、共享与vDCU调度实战解析

如果你接过“把一批海光 DCU 节点接进 Kubernetes,再让上层 AI 平台和 DeepSeek 推理服务跑起来”这种需求,第一反应大概率是:装个驱动、部署个 Device Plugin 不就行了?真动手之后才会发现,整卡、共享、vDCU 虚拟化是…

2026/9/12 4:34:47

2026年软考高级系统分析师论文备考指南与高分技巧

1. 2026年软考高级系统分析师论文备考指南作为国内IT领域最具含金量的职业资格认证之一,软考高级系统分析师(以下简称"系分")的论文环节一直是考生面临的"拦路虎"。不同于选择题和案例分析,论文写作不仅需要扎…

2026/9/12 4:34:47

Linux下TFTP服务器安装配置与优化指南

1. Linux下TFTP服务器的安装与配置指南在嵌入式开发和网络设备维护领域,TFTP(Trivial File Transfer Protocol)作为轻量级文件传输协议,因其实现简单、资源占用少的特点,成为固件更新、配置文件传输的标配工具。不同于…

2026/9/12 4:34:47

ThinkPHP在线客服系统实战:多坐席分配与部署调优全解析

简介:基于ThinkPHP框架打造的运营级在线客服系统源码,面向需要快速搭建网页客服、多坐席协作与智能客服平台的开发者和企业技术团队,可直接用于电商、官网、SaaS产品等场景的客户服务模块。系统包含实时聊天、坐席状态管理、访客分配、智能自…

2026/9/12 4:29:47

PyMC 采样与推断方法实战指南:MCMC、变分推断与诊断调优

PyMC 采样与推断方法实战指南:MCMC、变分推断与诊断调优 【免费下载链接】scientific-agent-skills Turn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000 scientists worldwide. 165 ready-to-use validated skills…

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码