分布式软总线认证方式分析

一、进入认证的入口判断

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:

  1. 设备发送了FAST_AUTH加密标签
  2. 能够找到对应的设备密钥 (GetFastAuthKey)
  3. 解密验证标签内容为"SOFTBUS_FAST_AUTH"成功
  4. 设备是潜在可信设备 (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 ); }

四、触发条件汇总表

认证方式条件标志必需前提失败回退
DmDeviceKeyisSupportDmDeviceKey=trueDM已预共享密钥→ HiChain PAKE
NormalizednormalizedType=SUPPORT+ 有可用密钥双方支持标准化链路→ HiChain PAKE
Fast AuthisSupportFastAuth=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协议更安全
认证速度⚡ 快(毫秒级)🐢 慢(涉及网络往返)
适用场景曾配对过的设备首次配对/密钥过期