分布式软总线认证方式分析
📅 2026/7/21 17:22:55
👁️ 阅读次数
📝 编程学习
一、进入认证的入口判断
在DeviceAuthStateEnter中,根据以下标志决定认证路径:
auth_session_fsm.c:L1290-L1299
if (info->normalizedType == NORMALIZED_SUPPORT || info->isSupportFastAuth || info->isSupportDmDeviceKey) { ret = TryRecoveryKey(authFsm); // 走快速认证 } else { // 走完整HiChain PAKE认证 if (!info->isServer) { ret = ProcessClientAuthState(authFsm); } }大分支有两种,一种走快速认证,一种走haichain完整认证
二、四种认证方式详解
认证方式优先级:DmDeviceKey > Normalized Auth > Fast Auth > HiChain PAKE
三、各认证方式触发条件
方式1️⃣:DmDeviceKey(设备密钥认证)-优先级最高
| 项目 | 说明 |
|---|---|
| 触发条件 | isSupportDmDeviceKey == true |
| 密钥来源 | 预共享的设备级密钥(DM Device Key) |
| 适用场景 | 设备管理器(DM)已建立过信任关系 |
| 代码位置 | auth_session_fsm.c:L1234-L1240 |
if (authFsm->info.isSupportDmDeviceKey) { AUTH_LOGI(AUTH_FSM, "reuse device key"); return ReuseDeviceKey(authFsm); // 直接复用,跳过PAKE协商 }何时设置:
- 当收到包含有效
DM_DEVICE_KEY_ID的设备ID消息时设置 - auth_session_json.c:L918-L925
方式2️⃣:Normalized Auth(标准化认证)
| 项目 | 说明 |
|---|---|
| 触发条件 | normalizedType == NORMALIZED_SUPPORT |
| 密钥来源 | 之前PAKE协商保存的normalizedKey |
| 适用场景 | 双方都支持标准化链路,且有可用的标准化密钥 |
| 代码位置 | auth_session_fsm.c:L1243-L1249 |
if (authFsm->info.normalizedType == NORMALIZED_SUPPORT) { AUTH_LOGI(AUTH_FSM, "normalized auth succ"); return RecoveryNormalizedDeviceKey(authFsm); }何时设置- auth_session_json.c:L661-L675:
- 双方都支持
BIT_SUPPORT_NORMALIZED_LINK特性 - 能够找到对应的normalizedKey进行解密验证
何时不设置:
- 对端版本过旧或不支持标准化:
NORMALIZED_NOT_SUPPORT - 密钥查找失败或解密失败:
NORMALIZED_KEY_ERROR
方式3️⃣:Fast Auth(快速认证)
| 项目 | 说明 |
|---|---|
| 触发条件 | isSupportFastAuth == true |
| 密钥来源 | 之前认证保存的会话密钥(设备Key) |
| 适用场景 | 设备曾在过去成功认证过,可以快速恢复密钥 |
| 代码位置 | auth_session_fsm.c:L1251-L1257 |
if (authFsm->info.isSupportFastAuth) { AUTH_LOGI(AUTH_FSM, "fast auth succ"); return RecoveryFastAuthKey(authFsm); }何时设置- auth_session_json.c:L720-L757:
- 设备发送了
FAST_AUTH加密标签 - 能够找到对应的设备密钥 (
GetFastAuthKey) - 解密验证标签内容为
"SOFTBUS_FAST_AUTH"成功 - 设备是潜在可信设备 (
IsPotentialTrustedDevice)
何时不设置:
- 对端版本过旧不发送fastAuth标签
- 找不到设备密钥
- 解密验证失败
- 设备不在可信关系中
方式4️⃣:HiChain PAKE(完整认证)
| 项目 | 说明 |
|---|---|
| 触发条件 | 上述三种快速认证都不支持 |
| 密钥来源 | PAKE协议实时协商生成 |
| 适用场景 | 首次认证、密钥过期、快速认证失败 |
| 代码位置 | auth_session_fsm.c:L1261-L1273 |
static int32_t ProcessClientAuthState(AuthFsm *authFsm) { return HichainStartAuth( authFsm->authSeq, authFsm->info.udid, authFsm->info.connInfo.peerUid, authFsm->info.userId ); }四、触发条件汇总表
| 认证方式 | 条件标志 | 必需前提 | 失败回退 |
|---|---|---|---|
| DmDeviceKey | isSupportDmDeviceKey=true | DM已预共享密钥 | → HiChain PAKE |
| Normalized | normalizedType=SUPPORT+ 有可用密钥 | 双方支持标准化链路 | → HiChain PAKE |
| Fast Auth | isSupportFastAuth=true | 曾成功认证过,有缓存密钥 | → HiChain PAKE |
| HiChain PAKE | 上述都不满足 | 无 | 最终认证方式 |
场景1: 两设备首次配对(无任何历史密钥) ├── normalizedType = NORMALIZED_NOT_SUPPORT(不支持标准化) ├── isSupportFastAuth = false(没有历史密钥) ├── isSupportDmDeviceKey = false(没有DM密钥) └── 进入: HiChain PAKE 完整认证 场景2: 设备曾认证过,恢复通信 ├── normalizedType = NORMALIZED_SUPPORT(支持且有密钥) ├── 进入: Normalized Auth(跳过PAKE协商) 场景3: DM预共享密钥场景 ├── isSupportDmDeviceKey = true(DM提供了设备密钥) ├── 进入: DmDeviceKey(最高优先级) 场景4: 历史密钥残留场景 ├── normalizedType = NORMALIZED_KEY_ERROR(密钥有问题) ├── isSupportFastAuth = true(快速认证密钥可用) └── 进入: Fast Auth六、快速认证 vs 完整认证的本质区别
| 对比项 | 快速认证 (RecoveryKey) | 完整认证 (HiChain PAKE) |
|---|---|---|
| 是否需要PIN码 | ❌ 不需要 | ✅ 需要(PAKE协议) |
| 密钥协商 | 从本地缓存恢复 | 实时ECDH类密钥交换 |
| 安全性 | 依赖历史密钥安全存储 | 基于PAKE协议更安全 |
| 认证速度 | ⚡ 快(毫秒级) | 🐢 慢(涉及网络往返) |
| 适用场景 | 曾配对过的设备 | 首次配对/密钥过期 |
编程学习
技术分享
实战经验