在5G系统中,一次成功的注册不仅是身份确认,更是一次从根密钥K出发、贯穿UDM→AUSF→AMF→gNB四层网元的密钥瀑布式衍生过程。3GPP在TS 33.501中定义的这套密钥层级(Key Hierarchy),用"锚点密钥逐级隔离、横向纵向交织更新"的设计,把长期密钥K永远锁在USIM与ARPF这两个安全边界之内,却又能让服务网络、接入网各自拿到独立的会话密钥。本文聚焦TS 33.501 Section 6.1.3(5G AKA流程)与Section 6.2(密钥层级与分发),逐信令、逐IE拆解密钥是如何一步步被"算出来"并"分下去"的。
在拆解机制前,必须先理解设计意图。4G的EPS-AKA密钥体系(K→CK/IK→K_ASME→K_eNB→各层密钥)存在三个被学术界和3GPP SA3工作组反复诟病的缺陷,TS 33.501正是针对这些缺陷做了重构:
| 痛点(EPS-AKA) | 后果 | 5G应对机制(TS 33.501) |
|---|---|---|
| IMSI明文空口传输,可被主动追踪 | 用户隐私泄露、IMSI Catcher攻击 | SUPI经ECIES加密为SUCI(§6.12),空口永不出现明文标识 |
| 服务网络不参与鉴权向量运算,CK/IK直接下发 | 漫游场景下归属网络对SN信任过载 | 引入K_AUSF,且K_SEAF的衍生绑定SNN(服务网络名),SN伪造身份即被切断 |
| 鉴权失败仍可能泄露RES,存在链接性(linkability) | 攻击者可关联同一UE多次会话 | 5G引入RES*/XRES*扩展响应,并要求UE侧同步刷新,失败即换SQN |
核心设计哲学一句话概括:长期密钥K永不离开安全边界,每一次衍生都把"网络身份"和"序列号"作为输入绑进密钥材料,让密钥既不可伪造也不可重放。
5G AKA遵循挑战-响应(challenge-response)范式,但与4G的关键区别在于:归属网络的鉴权向量被拆成两部分——5G HE AV(归属环境向量,含XRES、K_AUSF,留在AUSF)和5G SE AV(服务环境向量,含HXRES、K_SEAF,下发到AMF/SEAF)。这种"双向量"结构正是为了让AMF可以本地验证UE,而不必每次回AUSF。
sequenceDiagram
participant UE
participant SEAF as SEAF/AMF
participant AUSF
participant UDM as UDM/ARPF
UE->>SEAF: Registration Request (SUCI)
SEAF->>AUSF: Nausf_UEAuthentication Auth (SUCI, SNN)
AUSF->>UDM: Nudm_UEAuthentication Get (SUCI, SNN)
Note over UDM: SIDF解密SUCI→SUPI<br/>读取K,生成RAND/AUTN/RES
Note over UDM: 计算XRES*=KDF(CK‖IK,FC=0x6B,SNN,RAND,RES)<br/>计算K_AUSF=KDF(CK‖IK,FC=0x6A,SNN,SQN⊕AK)
UDM-->>AUSF: 5G HE AV(RAND,AUTN,XRES*,K_AUSF)
Note over AUSF: HXRES*=SHA256(RAND‖XRES*)取低128位<br/>K_SEAF=KDF(K_AUSF,FC=0x6C,SNN,SUPI)
AUSF-->>SEAF: 5G SE AV(RAND,AUTN,HXRES*,K_SEAF)
SEAF->>UE: NAS Authentication Request(RAND,AUTN,ngKSI)
Note over UE: USIM验MAC与SQN新鲜度<br/>算RES*,算K_AUSF,K_SEAF
UE->>SEAF: NAS Authentication Response(RES*)
Note over SEAF: HRES*=SHA256(RAND‖RES*)低128位<br/>本地比对 HRES* ?= HXRES*
SEAF->>AUSF: Nausf_Confirm(RES*)
Note over AUSF: 比对 RES* ?= XRES*
AUSF-->>SEAF: Auth Success
Note over SEAF,UE: 双向鉴权完成,各自推K_AMF
Note over UE: K_AMF=KDF(K_SEAF,FC=0x6D,ABBA,SUPI)
Note over SEAF: K_AMF=KDF(K_SEAF,FC=0x6D,ABBA,SUPI)
SEAF->>UE: Security Mode Command
逐步拆解每个消息中的关键IE:
① Registration Request(UE→AMF)
- 携带SUCI而非IMSI。SUCI是SUPI经ECIES(椭圆曲线集成加密方案)加密后的密文,scheme-output中包含临时公钥、密文、MAC。注意:如果UE尚无归属网络公钥,会退化为null-scheme(仅拼接+填充,不加密),这是工程中常见的"半保护"状态,抓包能看到SUCI但实际可被SIDF无密钥解出。
② Nausf_UEAuthentication_Get(AUSF→UDM)
- 关键IE:SUCI、Serving Network Name (SNN)。SNN的格式严格规定为5G:mnc<MNC>.mcc<MCC>.3gppnetwork.org。SNN会被绑入K_SEAF的推导,这是防止服务网络伪造身份的核心——任何篡改SNN的中间人,都会导致AMF与UE算出的K_SEAF不同,后续SMC必然失败。
③ UDM/ARPF生成鉴权向量
- USIM与ARPF共享长期密钥K,运行Milenage算法集(f1~f5)得到:MAC=f1(K,SQN,RAND,AMF)、AK=f5(K,RAND)、SQN⊕AK、CK=f3、IK=f4。
- AUTN的16字节结构为:SQN⊕AK ‖ AMF ‖ MAC。SQN的 freshness 是抗重放的关键。
④ NAS Authentication Request(AMF→UE)
- IE:RAND(16字节随机挑战)、AUTN(16字节鉴权令牌)、ngKSI(密钥集标识,用于后续密钥索引)、ABBA(防降级参数)。
- ngKSI是5G特有的,取值0~6,用于在多次重鉴权时区分不同密钥集,避免混淆。
⑤ UE侧验证与响应计算
- UE先校验MAC是否等于本地f1计算值,再校验SQN是否在有效窗口(防重放)。校验通过后:
- 计算RES=f2(K,RAND),再扩展为RES*
- UE侧独立推导K_AUSF、K_SEAF,与网络侧使用完全相同的KDF输入,这是密钥协商的基础。
⑥ SEAF本地验证 + AUSF终验
- SEAF计算HRES*=SHA256(RAND‖RES*)的低128位,与HXRES比对。这一步无需联系AUSF*即可判断UE是否持有正确密钥,大幅减少漫游回程信令。只有本地验证通过,才向AUSF发起确认,AUSF做最终的RES* vs XRES*严格比对。
TS 33.501 §6.2.1定义的密钥层级是一棵严格的树,每一层的衍生都遵循"父密钥+领域隔离参数→子密钥"的模式。
flowchart TD
K["K(根密钥)<br/>USIM ↔ ARPF"]
CKIK["CK, IK<br/>Milenage f3/f4"]
KAUSF["K_AUSF<br/>锚定于AUSF"]
KSEAF["K_SEAF<br/>服务网络锚点密钥"]
KAMF["K_AMF<br/>AMF锚点密钥"]
KGNB["K_gNB<br/>基站锚点密钥"]
KNASenc["K_NASenc"]
KNASint["K_NASint"]
KRRCenc["K_RRCenc"]
KRRCint["K_RRCint"]
KUPenc["K_UPenc"]
KUPint["K_UPint(仅N3IWF等)"]
K --> CKIK
CKIK -->|FC=0x6A| KAUSF
KAUSF -->|FC=0x6C + SNN| KSEAF
KSEAF -->|FC=0x6D + ABBA,SUPI| KAMF
KAMF -->|FC=0x6E 算法区分| KNASenc
KAMF -->|FC=0x6F 算法区分| KNASint
KAMF -->|FC=0x70| KGNB
KGNB -->|FC=0x69| KRRCenc
KGNB -->|FC=0x6A-AS| KRRCint
KGNB -->|FC=0x6B-AS| KUPenc
KGNB --> KUPint
classDef root fill:#ffe4b5,stroke:#333
classDef anchor fill:#87ceeb,stroke:#333
classDef leaf fill:#90ee90,stroke:#333
class K root
class KAUSF,KSEAF,KAMF,KGNB anchor
class KNASenc,KNASint,KRRCenc,KRRCint,KUPenc,KUPint leaf
设计意图:每一层密钥都对应一个安全终结点(termination point)。NAS层密钥(K_NAS)终结在UE与AMF之间,gNB根本拿不到;AS层密钥(K_RRC、K_UP)终结在UE与gNB之间,AMF也不存储它们。这种"按终结点分层"的设计,使得即使某个gNB被攻破,攻击者也只拥有该gNB的K_gNB,无法反推K_AMF,更无法解密历史NAS信令——这就是TS 33.501反复强调的密钥隔离(key separation)*原则。
5G所有密钥衍生都使用同一个KDF(TS 33.220定义),底层是HMAC-SHA-256。其输入结构是定长的TLV式拼接:
flowchart LR
subgraph KDF输入
FC["FC<br/>1字节函数码<br/>标识衍生哪种密钥"]
P0L0["P0 ‖ L0<br/>参数0 + 2字节长度"]
P1L1["P1 ‖ L1<br/>参数1 + 2字节长度"]
PN["... ‖ PN ‖ LN"]
end
KEY["父密钥<br/>作为HMAC的Key"]
OUT["KDF输出<br/>256位<br/>截断为所需长度"]
FC --> S["HMAC-SHA256"]
P0L0 --> S
P1L1 --> S
PN --> S
KEY --> S
S --> OUT
具体公式:KDF(Key, S) = HMAC-SHA-256(Key, S),其中S = FC ‖ P0 ‖ L0 ‖ P1 ‖ L1 ‖ ... ‖ Pn ‖ Ln,每个Li是该参数的字节长度(大端2字节)。
以K_AMF的衍生为例(TS 33.501 §6.2.2,Annex A.5):
| 参数 | 取值 | 说明 |
|---|---|---|
| Key | K_SEAF | 父密钥,256位 |
| FC | 0x6D | K_AMF衍生函数码 |
| P0 | ABBA | 防降级参数集 |
| L0 | 0x0002 | ABBA长度 |
| P1 | SUPI | 订阅永久标识,绑身份 |
| L1 | SUPI字节长度 | — |
为什么要把SUPI绑进K_AMF? 这是为了防止密钥混淆攻击:如果某个攻击者能让AMF误以为这是另一个SUPI的会话,由于SUPI是K_AMF的输入,推导出的密钥完全不同,攻击者无法复用旧密钥。ABBA参数则用于防止5G→4G的降级攻击(bidding down attack)——它编码了UE支持的安全特性集合,若被篡改导致降级,密钥推导会因ABBA不一致而失败。
各密钥的FC函数码速查(TS 33.501 Annex A.5):
| 子密钥 | FC | 关键输入参数 | 推导位置 |
|---|---|---|---|
| RES / XRES | 0x6B | CK‖IK, SNN, RAND, RES | UDM / UE |
| K_AUSF | 0x6A | CK‖IK, SNN, SQN⊕AK | UDM/ARPF / UE |
| K_SEAF | 0x6C | K_AUSF, SNN, SUPI | AUSF / UE |
| K_AMF | 0x6D | K_SEAF, ABBA, SUPI | AMF / UE |
| K_NASenc/int | 0x6E/0x6F | K_AMF, 算法区分符 | AMF / UE |
| K_gNB | 0x70 | K_AMF | AMF→gNB |
| K_RRCenc/int | 0x69/0x69 | K_gNB, 算法区分符 | gNB / UE |
| K_UPenc | 0x6B-AS | K_gNB | gNB / UE |
密钥层级树的静态部分讲完了,但UE是移动的——每次切换,gNB都可能换。如果每个新gNB都直接用K_AMF推K_gNB,那么所有gNB的K_gNB完全相同,密钥隔离形同虚设。TS 33.501 §6.9设计了horizontal与vertical两种密钥推演模式,用NH参数和NCC计数器实现"每切一次换一个密钥"。
flowchart TD
KAMF0["K_AMF"]
KGNB0["K_gNB(初始)<br/>NCC=0"]
NH1["NH1=KDF(K_AMF,K_gNB)<br/>NCC=1"]
NH2["NH2=KDF(K_AMF,NH1)<br/>NCC=2"]
KAMF0 --> KGNB0
KAMF0 --> NH1
NH1 --> NH2
KGNB0 -->|水平 H0| T1["K_gNB'=KDF(K_gNB,0x6E,PCI,ARFCN)<br/>源gNB本地推,无需回AMF"]
NH1 -->|垂直 V1| T2["K_gNB''=KDF(NH,0x6F,PCI,ARFCN)<br/>AMF提供NH,前向安全更强"]
classDef horiz fill:#ffb6c1,stroke:#333
classDef vert fill:#b0e0e6,stroke:#333
class T1 horiz
class T2 vert
水平推演(horizontal key derivation,FC=0x6E):
- 新密钥K_gNB' = KDF(K_gNB, 0x6E, target-cell-PCI, ARFCN-DL)。
- 由源gNB在本地完成,无需回AMF。
- 优点:快,适合Xn切换的紧急场景。
- 缺点:新gNB的密钥仍可由源gNB推导出来,前向安全性弱——若源gNB被攻破,后续一串水平衍生的密钥全部暴露。
垂直推演(vertical key derivation,FC=0x6F):
- 新密钥K_gNB'' = KDF(NH, 0x6F, target-cell-PCI, ARFCN-DL)。
- NH(Next Hop)参数由AMF从K_AMF迭代推导:NH_n = KDF(K_AMF, NH_{n-1})。
- 优点:新gNB的密钥无法从源gNB的K_gNB反推,前向安全性强。即使源gNB被攻破,已用垂直推演切换到的新gNB密钥仍然安全。
- NCC(Next hop Chaining Counter)随每次推演递增,UE与网络据此同步使用哪一个NH。
工程权衡:默认优先垂直推演(前向安全),仅当AMF无法及时提供NH时退化为水平推演。这就是为什么切换命令(Handover Command)中会携带NCC和可能的NH参数。
5G支持两种主鉴权:5G AKA(TS 33.501 §6.1.3)和EAP-AKA'(§6.1.2)。后者用于非3GPP接入(如可信非3GPP接入、Wireline接入)。两者的密钥源头都是K,但衍生路径不同。
| 维度 | 5G AKA | EAP-AKA' |
|---|---|---|
| 适用接入 | 3GPP接入(NR/E-UTRA) | 非可信非3GPP接入 |
| 鉴权向量 | 5G HE AV / 5G SE AV双向量 | EAP-AKA'向量,复用3G机制+MK重新计算 |
| 响应值 | RES / XRES(256位扩展) | RES / EAP消息 |
| 服务网络本地验证 | HRES*本地比对(有) | 无本地验证,依赖AUSF |
| 锚点密钥 | K_SEAF | K_AUSF(EAP后转K_SEAF) |
| SNN绑定 | 强制 | 强制(通过AT_RAND改写) |
5G AKA的"双向量+HRES*本地验证"是EAP-AKA'所没有的优化,这正是5G AKA为漫游场景量身定制的原因——漫游时服务网络要频繁鉴权,本地验证省去了大量到归属网络的回程。
用Wireshark/TShark过滤5G-NAS协议,识别5G AKA流程:
- Authentication Request:消息类型0x56(5G MM),IE含RAND(16字节)、AUTN(16字节)、ngKSI、ABBA。
- Authentication Response:消息类型0x57,IE含RES*。注意RES比4G的RES长得多(最长256位),这是5G扩展响应的标志。
- Security Mode Command*:消息类型0x5C,携带选定的加密/完整性算法(如NEA2/NEA3、NIA2)、ngKSI、REPLAYED UE SECURITY CAPABILITY。SMC的出现标志着K_AMF已就绪、NAS安全上下文激活。
| 故障现象 | 根因 | 排错思路 |
|---|---|---|
| Authentication Reject | UE算出的MAC≠网络MAC,或SQN失步 | 检查USIM的K/OPc与HSS是否一致;查SQN是否需重同步 |
| SQN失步(#MAC失败但SQN不对) | USIM本地SQN与HSS严重不同步 | UE发起Re-synchronization,用AUTS携带,UDM调整SQN |
| Security Mode Reject | K_AMF两侧不一致,SMC完整性校验失败 | 抓包核对SNN、ABBA、SUPI三参数是否被中间设备篡改 |
| 切换后业务中断 | NCC失步,UE与gNB用的NH不对 | 检查Handover Command中的NCC/NH,确认水平/垂直推演模式一致 |
SQN重同步是高频故障:当UE认为收到的SQN"太旧或超出窗口",会拒绝鉴权并回Authentication Failure(cause=Synch failure),携带AUTS字段。UDM据此用特殊算法反推正确的SQN值,重新生成向量。这是5G AKA继承自3G/4G的经典机制。
Q1:K_AUSF和K_SEAF都是"锚点密钥",为什么要分两层? A:K_AUSF锚定在归属网络(AUSF),绑定SQN⊕AK,与具体服务网络无关;K_SEAF锚定在服务网络(SEAF/AMF),绑定SNN。分两层是为了让归属网络和服务网络各持一段不可由对方反推的密钥材料——服务网络无法冒用归属网络身份,归属网络也不直接持有服务网络会话密钥。这把信任边界切得很干净。
Q2:为什么5G要在RES基础上扩展成RES*? A:4G的RES长度仅64位,存在被暴力枚举和关联分析的风险,且响应值本身可被攻击者用于链接同一UE的多次会话(linkability)。RES*用KDF把RES扩展到最长256位并混入RAND、SNN,既增加熵又破坏可链接性。HXRES*/HRES*则是RES*的SHA-256哈希,让SEAF能在不持有K_AUSF的前提下本地验证UE。
Q3:水平推演不安全,为什么还要保留? A:水平推演由源gNB本地完成,零回程信令、零额外时延,在Xn切换的紧急移动场景下是唯一能满足时延要求的方式。垂直推演虽前向安全,但需要AMF提供NH,增加一次N2交互。标准让二者并存,由切换场景的时延敏感度决定取舍——这正是协议设计的工程现实感。
Q4:K_AMF推K_gNB用的是FC=0x70,但K_gNB推K_RRC用的是0x69,会不会与K_AUSF的0x6A冲突? A:不会。每个KDF的输入密钥(Key)不同——K_AUSF衍生时Key是CK‖IK,K_RRC衍生时Key是K_gNB。HMAC的输出依赖Key,即使FC相同,只要Key不同,输出就完全无关。不过为可读性,标准尽量让不同语义的衍生用不同FC。
Q5:USIM能存K_AMF吗?换卡换机后如何恢复安全上下文? A:可以。TS 33.501 §6.2.3规定,若USIM支持5G参数存储,K_AMF应存在USIM中;否则存在ME的非易失性存储器。换机时若USIM存了K_AMF,新ME可恢复安全上下文(安全上下文可携带);若存在旧ME且ME未正确清除,存在残留密钥风险,这是设备回收时需注意的安全点。
本文由「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 等场景全覆盖。
