一、进入认证的入口判断
在 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协议更安全 |
| 认证速度 | ⚡ 快(毫秒级) | 🐢 慢(涉及网络往返) |
| 适用场景 | 曾配对过的设备 | 首次配对/密钥过期 |