在5G系统中,一次主认证(5G-AKA / EAP-AKA')建立的密钥材料并不会"一钥到底"地贯穿用户整个移动生命周期。每发生一次切换,空口上用于加密与完整性保护的接入层(AS)密钥 KNG-RAN(即 KgNB)都必须被刷新,以保证不同小区、不同 gNB 之间的密钥隔离,并在 gNB 节点被攻破时提供前向安全(Forward Security)。这套"切换即换钥"的机制由 3GPP TS 33.501 的 Section 6.9(密钥派生)与 Annex A(KDF 函数族)定义,核心是 NH(Next Hop)链 + NCC(Next Hop Chaining Counter) 与 水平/垂直推演(horizontal/vertical key derivation) 两条派生路径。本文聚焦该机制,逐层拆解密钥派生的算法输入、Xn/N2 切换信令中密钥的传递路径,以及 UE 与网络如何基于 nextHopChainingCount 保持同步。
直接复用主认证派生出的 KAMF 在每次切换时为新的 gNB 派生 KNG-RAN 会有两个严重问题:
KNG-RAN,攻击者一旦攻破其中一个 gNB,即可解密另一个 gNB 下该 UE 的空口流量。KAMF 直接派生,而 KAMF 在 AMF 中长期不变,那么一旦 AMF 被攻破,过去与未来的所有切换密钥都可能被推导出来。3GPP 的解决方案借鉴并强化了 LTE(TS 33.401)的 NH 链思想:引入一个由 AMF 单向维护的 NH 链,配合 gNB 本地的"水平推演",在前向安全强度与AMF 信令开销之间取得平衡。核心原则记录在 TS 33.501 Section 6.9.2 中。
理解切换密钥推演,必须先看清整条密钥链。下表与下图共同刻画了从永久根密钥 K 到空口算法密钥的完整派生路径。
flowchart TD
K["K(永久根密钥)<br/>驻留于 USIM 与 UDM/ARPF"]
CK["CK, IK(认证向量)<br/>不出 USIM/UDM"]
KAUSF["K_AUSF(AUSF & UE)<br/>Annex A.2"]
KSEAF["K_SEAF(SEAF/AMF & UE)<br/>Annex A.3"]
KAMF["K_AMF(AMF & UE)<br/>Annex A.4"]
KNAS["K_NASint / K_NASenc<br/>NAS 安全<br/>Annex A.6 / A.7"]
KNGRAN["K_NG-RAN (KgNB)<br/>Annex A.9"]
NH["NH(Next Hop)<br/>Annex A.10"]
ASK["算法密钥<br/>K_RRCenc / K_RRCint<br/>K_UPenc / K_UPint"]
KRRCenc["K_RRCenc"]
KRRCint["K_RRCint"]
KUPenc["K_UPenc"]
KUPint["K_UPint"]
K -->|5G-AKA / EAP-AKA'| CK
CK -->|KDF| KAUSF
KAUSF -->|KDF| KSEAF
KSEAF -->|KDF| KAMF
KAMF -->|KDF| KNAS
KAMF -->|KDF| KNGRAN
KAMF -->|KDF| NH
NH -.->|切换垂直推演 Annex A.11| KNGRAN
KNGRAN -->|算法特定 KDF Annex A.8| ASK
ASK --> KRRCenc
ASK --> KRRCint
ASK --> KUPenc
ASK --> KUPint
classDef root fill:#1f4e79,color:#fff,stroke:#0b2a4a
classDef anchor fill:#2e7d32,color:#fff,stroke:#1b5e20
classDef ran fill:#8e44ad,color:#fff,stroke:#5b2c6f
classDef hop fill:#c0392b,color:#fff,stroke:#7b241c
class K root
class KAUSF,KSEAF,KAMF anchor
class KNGRAN,ASK,KRRCenc,KRRCint,KUPenc,KUPint ran
class NH hop
| 密钥 | 派生自 | 驻留位置 | 用途 | KDF 定义 |
|---|---|---|---|---|
K |
— | USIM / UDM·ARPF | 永久根密钥,认证起点 | — |
CK, IK |
K(认证) |
USIM / ARPF(不外送) | 派生 KAUSF |
— |
KAUSF |
CK, IK |
AUSF / UE | AUSF 锚密钥 | Annex A.2 |
KSEAF |
KAUSF |
SEAF(AMF) / UE | SEAF 锚密钥 | Annex A.3 |
KAMF |
KSEAF |
AMF / UE | AMF 锚密钥,NAS 与 RAN 密钥根 | Annex A.4 |
KNG-RAN (KgNB) |
KAMF |
gNB / UE | 派生 AS 算法密钥的根 | Annex A.9 |
NH |
KAMF(链式) |
AMF(链)/ gNB(当前值) | 提供切换前向安全的新鲜材料 | Annex A.10 |
KRRCenc/int, KUPenc/int |
KNG-RAN |
gNB / UE | RRC/UP 加密与完整性 | Annex A.8 |
需要特别强调:KAMF 是"分水岭"。它之上(KSEAF/KAUSF)属于核心网锚密钥,几乎不随移动事件变化;它之下(KNG-RAN 及 AS 算法密钥)则随每次切换被刷新。NH 链正是连接 KAMF 与切换密钥的"新鲜度桥梁"。
当 KAMF 首次派生完成(注册成功或 KAMF 刷新后),AMF 立即计算 NH 链的初始值并维护一个计数器 NCC。NH 链是一个单向哈希链:
NH(0) ← 由 KAMF 直接派生(初始),NCC = 0
NH(i+1) = KDF(KAMF, NH(i)) // Annex A.10,单向不可逆
由于 KDF 基于 HMAC-SHA-256,给定 NH(i) 无法反推 NH(i-1),更无法反推 KAMF。这条单向性是前向安全的数学基础:只要某个 gNB 持有的是"较新"的 NH,即使它被攻破,也只能获得该 NH 及其之后派生的密钥,无法回溯或前推链上其他节点。
NCC(Next Hop Chaining Counter)是一个 0–7 的循环计数器,作为 NH 链上位置的"游标"。UE 和网络各自维护一个本地 NCC:
ReconfigurationWithSync 中的 nextHopChainingCount(TS 38.331),UE 将其与本地 NCC 比较;KNG-RAN),UE 不需更新 NH;这种"差值比对"的设计,使得 UE 无需知道网络侧 NH 链的全貌,仅靠一个计数器即可与网络保持同步——这是 TS 33.501 的精妙之处。
stateDiagram-v2
direction LR
[*] --> Reg: 主认证完成<br/>KAMF 派生<br/>AMF 算 NH(0), NCC=0
Reg --> Served: AMF 经 ICS 向 gNB 推送<br/>{NH(0), NCC=0}<br/>gNB 用 KAMF→KNG-RAN
Served --> HO_H: Xn 切换(无新NH可用)<br/>水平推演<br/>KNG-RAN*=KDF(KNG-RAN, PCI, ARFCN)<br/>NCC 不变
Served --> HO_V: 切换(有新NH可用)<br/>垂直推演<br/>KNG-RAN*=KDF(NH, PCI, ARFCN)<br/>NCC+1, NH 链推进
HO_H --> Served2: 新 gNB 持有 KNG-RAN*<br/>NCC 不变
HO_V --> Served2: 新 gNB 持有 KNG-RAN*<br/>NCC+1
Served2 --> HO_V2: 下一次切换<br/>AMF 可提供更深的 NH(i)
切换发生时,源 gNB 负责为目标 gNB 派生新的 KNG-RAN*。它有两条派生路径,记录在 Annex A.11(目标为 gNB)与 A.12(目标为 ng-eNB,4G 互操作)。
KNG-RAN* = KDF( KNG-RAN, PCI_target || ARFCN-DL_target ) // Annex A.11
NCC 不变
输入密钥是当前的 KNG-RAN。优点是无需 AMF 参与、信令开销最小,可在 Xn 接口上连续多次切换。缺点是:不提供前向安全——因为当前 KNG-RAN 已经存在于被攻破风险的源 gNB 中,从它派生的新密钥与它在同一"密钥等价类"内。
KNG-RAN* = KDF( NH, PCI_target || ARFCN-DL_target ) // Annex A.11
NCC 加 1,NH 链推进
输入密钥是NH。由于 NH 来自由 KAMF 维护的单向链,垂直推演提供前向安全:即便源 gNB 被攻破拿到当前 NH,攻击者也无法推导 AMF 中更深位置的 NH,因而无法获取后续切换的密钥。
源 gNB 持有 KNG-RAN、NH、NCC 三元组。规则(Section 6.9.2.1.1)可概括为:
PCI_target 与 ARFCN-DL_target 作为派生输入,确保不同目标小区派生出的密钥天然不同——即使两次切换复用相同 NH,密钥也不同。这是"一小区一钥"隔离的关键。
| 维度 | 水平推演(Horizontal) | 垂直推演(Vertical) |
|---|---|---|
| 输入密钥 | 当前 KNG-RAN |
NH(链上当前值) |
| NCC 变化 | 不变 | +1(推进 NH 链) |
| AMF 参与 | 否(Xn 上可连续) | 需要 AMF 提供/持有 NH 链 |
| 前向安全 | ❌ 无 | ✅ 有 |
| 触发条件 | 无可用新鲜 NH | 持有未消耗的新 NH |
| Annex | A.11(同 A.11,输入不同) | A.11 |
| 典型场景 | 连续 Xn 切换、乒乓切换 | N2 切换、首次移动、AMF 推 NH 后 |
下图展示一次 Xn 切换中,密钥如何在源 gNB、目标 gNB、UE 之间流动。注意 NCC 如何通过 RRC 传递给 UE。
sequenceDiagram
autonumber
participant UE
participant SgNB as 源 gNB<br/>{KNG-RAN, NH, NCC}
participant TgNB as 目标 gNB
participant AMF
Note over SgNB: 持有未消耗的新鲜 NH<br/>决定使用垂直推演
SgNB->>TgNB: XnAP Handover Request<br/>含 KNG-RAN*(已派生)、NCC'、<br/>算法列表、UP/CP 安全策略
Note over TgNB: 用 KNG-RAN* 派生<br/>KRRCenc/int, KUPenc/int
TgNB-->>SgNB: XnAP Handover Request Acknowledge<br/>含 HO Command(含 NCC')
SgNB->>UE: RRCReconfiguration<br/>→ ReconfigurationWithSync<br/>含 nextHopChainingCount=NCC'<br/>+ target Cell ID(隐含 PCI/ARFCN)
Note over UE: 比对 NCC' 与本地 NCC<br/>NCC'==本地+1 → 推进 NH 链<br/>垂直推演: KNG-RAN*=KDF(NH,PCI,ARFCN)
UE->>TgNB: 随机接入 + RRCReconfigurationComplete<br/>用新 KNG-RAN* 派生的算法密钥加解密
TgNB->>AMF: NGAP Path Switch Request<br/>含新 KNG-RAN* 的安全上下文、NCC'
AMF-->>TgNB: Path Switch Request Acknowledge<br/>若 NCC' 已到链尾,<br/>AMF 推送更深 NH(i)、NCC'' 供下次切换
Note over AMF: NH(i+1)=KDF(KAMF, NH(i))<br/>维护 NH 链
① XnAP Handover Request(源→目标 gNB)中的安全相关 IE:
NR Encryption Algorithm / NR Integrity Protection Algorithm:目标侧 RRC 安全算法,gNB 据此选择算法特定 KDF。UP Transport Layer Encryption / UP Integrity Protection:用户面算法与策略。NR PDCP SN Status Transfer 相关 IE:保证 PDCP 序号连续性。KNG-RAN*:源 gNB 已执行 A.11 推演,目标 gNB 直接获得"切换后的根",无需自己从 NH 再算。nextHopChainingCount:随 HO Command 透传到 UE。② RRC ReconfigurationWithSync(TS 38.331)中的 IE:
nextHopChainingCount(NCC,0–7):UE 判定水平/垂直推演的唯一依据。cellIdentity、SSB 子载波间隔、rach-ConfigDedicated:UE 据此接入;PCI 与 ARFCN-DL 不直接出现,但 UE 通过同步获取 PCI,并从配置中获知载波,作为 A.11 的派生输入。③ NGAP Path Switch Request Acknowledge(AMF→目标 gNB):
N2(NG-based)切换中,源 gNB 通过 NGAP Handover Required 将当前安全上下文(含 source-to-target transparent container 与 KNG-RAN/NH 指示、NCC)发给 AMF。AMF 作为"密钥中转":
Handover Request 中提供 NH + 递增的 NCC,由目标 gNB 执行垂直推演(这与 Xn 切换中由源 gNB 推演不同)。KNG-RAN,目标 gNB 执行水平推演。因此 Xn 切换推演在源侧、N2 切换推演可在目标侧由 AMF 喂入 NH——这是两条信令路径在安全上的根本差异,也是为何 N2 切换更容易获得前向安全的原因。
Annex A.11 的 KDF 调用遵循 TS 33.220 定义的通用 KDF 框架:
KEY = HMAC-SHA-256( Key_in, S = FC || P0 || L0 || P1 || L1 || ... )
对于 KNG-RAN*(target gNB):
FC = 0x6E(KNG-RAN* 的功能码)P0 = PCI_target(2 字节),L0 为其长度P1 = ARFCN-DL_target(3 字节),L1 为其长度Key_in 在水平推演时为 KNG-RAN,垂直推演时为 NH。算法完全相同,唯一差异是输入密钥——这一点常被误解。许多实现错误地把"水平/垂直"理解为不同算法,实际上标准只用同一 KDF、不同输入。
为何选 PCI 与 ARFCN-DL? 它们足够稳定地标识目标小区,且 UE 与网络都无需额外信令即可获得(PCI 来自同步,ARFCN 来自测量配置)。把频率信息纳入派生,使得同频切换与异频切换的密钥天然隔离,进一步加强了密码学隔离边界。
KAMF 并非永久不变。在以下场景 AMF 会执行 KAMF 刷新(Annex A.5,基于 KSEAF 与新的 ngKSI):
KAMF 一旦刷新,整条 NH 链被重置:AMF 重新计算 NH(0)、NCC 归零。UE 收到新的 NAS Security Mode Command(携带新 ngKSI)后同步刷新 KAMF 与 NH 链。这是一次"全链级联刷新",是 5G 应对长期会话密钥暴露的最高级别动作。在抓包中表现为:一次完整的 NAS SMC 之后紧跟 Initial Context Setup,且随后切换的 NCC 从 0 重新开始递增。
Handover Request 中找到安全相关 IE;Handover Request Acknowledge 中的 HO Command(透传的 RRC 容器)虽不可见明文(PDCP 加密),但可用日志解析出 nextHopChainingCount。ReconfigurationWithSync 中读取 nextHopChainingCount,与上一次值比较即可判定水平/垂直。Path Switch Request Acknowledge 或 UE Context Modification 中若出现新的 NH/NCC 下发,即为 AMF 主动续链。Sec Ctx Update 事件会记录 nhcc(即 NCC)变化与 KgNB 重新生成。| 现象 | 根因 | 排查思路 |
|---|---|---|
| 切换后 UE 接入失败、RRC 重建 | UE 侧 NCC 与网络侧不同步(如丢失一次 ReconfigurationWithSync) |
对比 UE 日志 nhcc 与 gNB 期望值;检查是否因层 2 重传丢失 RRC 消息 |
| 切换后完整性校验失败 | UE 误判水平/垂直(PCI/ARFCN 输入不一致) | 检查 UE 测量上报的频点与目标小区实际配置是否一致 |
| 长时间移动后随机出现安全失败 | NH 链"耗尽"且 AMF 未及时续链(连续水平推演后某次需要垂直但无 NH) | 检查 AMF 在 Path Switch Ack 中是否下发新 NH;评估 ngKSI 周期性刷新策略 |
| N2 切换后前向安全弱 | AMF 始终透传 KNG-RAN(水平),未利用 NH |
检查 AMF/NACF 实现是否在 Handover Request 中携带 NH+递增 NCC |
| ## 九、前向安全的攻击面:学术视角 |
ETH Zürich 的形式化分析(WISEC'21,"A Comprehensive Formal Analysis of 5G Handover")与 Linköping 大学的"5G Handover: When Forward Security Breaks"(SECRYPT'23)系统性地指出:水平推演是 5G 切换前向安全的主要薄弱点。由于 Xn 切换可在无 AMF 介入下连续进行,攻击者若在水平推演链上的某个 gNB 节点实施物理或供应链攻破,可沿水平派生链向"未来"若干次切换推导密钥——直至某次垂直推演(依赖 AMF 续链)打破该等价类。
这意味着运营商在保障前向安全时的关键工程指标是:控制连续水平推演的最大次数,即缩短"AMF 续链间隔"。这也是 R17/R18 以来 SA3 持续讨论增强 NH 链管理(如更激进的 Path Switch Ack 续链、KAMF 周期刷新缩短)的动因。
这套机制是 5G 在大规模分布式 RAN 部署下,"既要 gNB 解耦、又要密码学严格"的工程典范。
Q1:水平推演和垂直推演用的是不是同一个 KDF 算法?
A:是的,两者都调用 Annex A.11 的同一个 KDF(FC=0x6E,入参 PCI、ARFCN-DL)。唯一区别是输入密钥:水平用当前 KNG-RAN,垂直用 NH。所谓"水平/垂直"指输入密钥来源,而非算法本身。
Q2:UE 如何知道本次切换是水平还是垂直推演?
A:UE 通过比较 RRC ReconfigurationWithSync 中的 nextHopChainingCount 与本地 NCC:相等则为水平(用 KNG-RAN),等于本地+1 则为垂直(推进 NH 链后用 NH 派生)。UE 不需要额外信令指示。
Q3:连续多次 Xn 切换会不会耗尽 NH 链导致不安全?
A:会。连续水平推演不会消耗 NH,但前向安全减弱;一旦 AMF 通过 Path Switch Request Acknowledge 或 UE Context Modification 下发更深的 NH(NCC 递增),下一次切换即可恢复垂直推演。运营商应控制连续水平推演的最大窗口,必要时缩短 KAMF 周期刷新以重置 NH 链。
Q4:N2 切换与 Xn 切换在密钥推演上最大的区别是什么?
A:Xn 切换由源 gNB 完成推演并把 KNG-RAN* 直接传给目标 gNB,AMF 不参与密钥;N2 切换中 AMF 介入,可在 Handover Request 中向目标 gNB 下发 NH+递增 NCC,由目标 gNB 完成垂直推演。因此 N2 切换天然有更强的前向安全获得能力。
Q5:KAMF 刷新后 NH 链会怎样?
A:KAMF 刷新(如重新主认证、AMF 变更)会重置整条 NH 链:AMF 重新计算 NH(0)、NCC 归零,UE 同步刷新。这是 5G 应对长期密钥暴露的最高级刷新动作,抓包上表现为 NAS Security Mode Command 后 NCC 从 0 重新递增。
本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
