想象你是一家银行的金库管理员。最里面的保险柜有一把"祖传主钥匙",永远锁在地下金库的最深处,从不直接使用。每天开门时,主管用主钥匙打开内层门,取出一把"日钥匙"交给大厅经理;大厅经理再用日钥匙派生出"窗口钥匙"分给柜员;柜员用窗口钥匙才能打开客户面前的保险箱。
这样设计有一个核心好处:最珍贵的根密钥永远不离开金库,但每一次派生出来的子钥匙都能完成具体任务。即使某个窗口钥匙被偷,柜员被换,主钥匙依然安全,第二天重新派生一把新钥匙即可。
5G 系统的安全体系,用的就是完全相同的"密钥派生接力"思想。一根永不外泄的永久密钥 K,经过一连串单向派生,最终变成空口上加密信令和数据的临时钥匙。理解了这条接力链,你就理解了 5G 安全设计 80% 的精髓。
很多初学者会问:既然终端(UE)和核心网(UDM)共享一把永久密钥 K,为什么不直接用它加密所有通信?非得派生一堆子密钥,是不是多此一举?
答案藏在三个工程现实里:
密钥泄露隔离:一旦空口密钥被破解(例如伪基站攻击、侧信道攻击),攻击者只能获得这一层的临时密钥,无法回溯到根密钥 K。换一把临时钥匙,攻击归零。
职责分离:加密 NAS 信令、加密 RRC 信令、加密用户面数据,需要不同的密钥。这样即使某类流量被破译,不会波及其他类型——这就是"分而治之"的安全原则。
移动性锚定:用户在基站间频繁切换,每次切换都要换 gNB 密钥。但有些密钥(如 K_SEAF)必须跨 AMF 保持稳定,否则一换 AMF 就要重新做一次完整认证,网络根本扛不住。
所以 5G 的密钥不是一棵树,更像一条接力链:每一段密钥有明确的"作用域"和"生命周期",用完即弃,层层向下。
下面这张图是 5G 安全的核心——从永久密钥 K 一直派生到空口临时密钥的完整链路。
flowchart TD
K["永久密钥 K<br/>(USIM ↔ UDM 共享,永不出库)"]
CKIK["CK / IK<br/>(认证过程派生的中间密钥)"]
KAUSF["K_AUSF<br/>(锚定在 AUSF)"]
KSEAF["K_SEAF<br/>(锚定在 AMF/SEAF,跨 AMF 移动性锚)"]
KAMF["K_AMF<br/>(锚定在 AMF)"]
KGNB["K_gNB<br/>(锚定在 gNB)"]
KNAS["KNASint / KNASenc<br/>(NAS 信令保护)"]
KRRC["KRRCint / KRRCenc<br/>(RRC 信令保护)"]
KUP["KUPint / KUPenc<br/>(用户面数据保护)"]
K -->|AKA 认证| CKIK
CKIK --> KAUSF
KAUSF --> KSEAF
KSEAF --> KAMF
KAMF --> KGNB
KAMF --> KNAS
KGNB --> KRRC
KGNB --> KUP
style K fill:#ffd6d6,stroke:#c00
style KSEAF fill:#fff2cc,stroke:#bf9000
style KUP fill:#d9ead3,stroke:#38761d
派生的每一步都走一个标准化的 KDF(密钥派生函数),输入是"上一层密钥 + 一串参数(如网络名、算法标识、计数值)",输出是下一层密钥。整个过程是单向的——你无法从子密钥反推出父密钥(这依赖哈希函数的单向性)。
下面这张表把这条链上每个密钥的"职责"和"归属"讲清楚,这是工程师排查安全问题时最常查阅的一张表。
| 密钥 | 派生方 / 持有方 | 主要用途 | 生命周期 |
|---|---|---|---|
K |
USIM ↔ UDM/ARPF | 永久根密钥,一切派生的源头 | 长期(写卡时固化) |
CK/IK |
认证向量派生 | 加密/完整性中间密钥(4G 遗留概念) | 一次认证周期 |
K_AUSF |
UDM 派生,AUSF 持有 | 锚定本次认证,参与派生 K_SEAF | 归属网络内 |
K_SEAF |
AUSF 派生,AMF(SEAF) 持有 | 移动性锚,跨 AMF 重定位保持稳定 | 跨 AMF 稳定 |
K_AMF |
AMF 从 K_SEAF 派生 | 派生 NAS 密钥与 gNB 密钥 | 当前 AMF 内 |
K_gNB |
AMF↔UE 派生,gNB 持有 | 基站侧信令与用户面根密钥 | 当前 gNB 内 |
KNASint/enc |
AMF↔UE | NAS 信令完整性/加密 | NAS 连接期 |
KRRCint/enc |
gNB↔UE | RRC 信令完整性/加密 | gNB 连接期 |
KUPint/enc |
gNB↔UE | 用户面数据完整性/加密 | gNB 连接期 |
记住一个关键区分:带 int 的是完整性保护(防篡改),带 enc 的是加密保护(防窃听)。5G 相比 4G 的一个重大进步是用户面(UP)也支持了完整性保护——这意味着哪怕数据被解密,也无法被悄悄篡改。
密钥链的源头活水,来自一次主认证(Primary Authentication)。5G 支持两种主认证方式:5G AKA(继承自 4G,做了安全增强)和 EAP-AKA'(基于通用 EAP 框架,更灵活)。核心思想都是"挑战-应答":网络出一个随机数考你,终端用共享密钥 K 算出答案,证明"我真的是这个用户"。
sequenceDiagram
participant UE as 终端 UE
participant SEAF as SEAF/AMF<br/>(服务网络)
participant AUSF as AUSF<br/>(归属认证服务器)
participant UDM as UDM/ARPF<br/>(持有永久密钥K)
UE->>SEAF: 注册请求 (携带 SUCI)
SEAF->>AUSF: 请求认证 (SUCI/SUPI, SN-Name)
AUSF->>UDM: 请求生成认证向量
UDM->>UDM: 用 K + RAND 计算 RES*/XMAC/AUTN
UDM-->>AUSF: 返回认证向量 (RAND, AUTN, XRES*, ...)
AUSF-->>SEAF: 返回 RAND, AUTN (挑战)
SEAF-->>UE: 下发认证请求 (RAND, AUTN)
UE->>UE: 用 K 验证 AUTN, 计算 RES*
UE-->>SEAF: 返回认证响应 (RES*)
SEAF->>AUSF: 转发 RES* 用于验证
AUSF->>AUSF: 比对 RES* 与 XRES*<br/>成功则派生 K_SEAF
AUSF-->>SEAF: 认证成功 + K_SEAF
SEAF->>SEAF: 从 K_SEAF 派生 K_AMF
SEAF-->>UE: 安全模式命令 (SMC)<br/>激活 NAS 加密与完整性
这套流程里有几个"为什么这样设计"的精妙之处:
为什么终端要先用 AUTN 验证网络? 这是 5G AKA 的"双向认证"升级。在旧的 2G 协议里,只有网络验证终端,没有终端验证网络,于是诞生了"伪基站"攻击——假基站骗终端交出身份。5G 里终端先验 AUTN,确认"对面真的是我的归属网络授权的",才肯给出应答。这就堵死了伪基站骗取认证响应的老路。
为什么 K_SEAF 要用服务网络名(SN-Name)参与派生? 这是一条"绑定"措施。它把这次认证牢牢绑定到具体的服务网络(比如中国移动),防止一个网络的认证响应被"搬运"到另一个网络去重放攻击。EAP-AKA' 的那个"撇号(prime)"增强,本质也是干这件事——把接入网络身份绑进密钥派生。
如果说密钥派生是保护"通信内容",那 SUCI 解决的是另一个更基础的问题——保护"你是谁"。
在 2G/3G/4G 时代,永久身份 IMSI 在初次接入时常常以明文(或可被快速破解的弱保护)发送。攻击者用一个伪基站 + 一个空密码就能让手机吐出 IMSI,这就是臭名昭著的 IMSI Catcher 攻击。拿到 IMSI,就能长期跟踪、定位这个用户。
5G 的解决方案是 SUPI/SUCI 体系:
flowchart TD
subgraph 终端侧["终端侧 (USIM)"]
SUPI["永久身份 SUPI"]
PK["归属网络公钥<br/>(写卡时预置)"]
SUCI["临时身份 SUCI<br/>(ECIES 加密包)"]
SUPI -->|ECIES 加密 + 临时密钥| SUCI
PK -.-> SUCI
end
subgraph 空口["空口传输"]
SUCI2["只能看到 SUCI<br/>(无法还原 SUPI)"]
end
subgraph 归属网["归属网络 (UDM/SIDF)"]
SK["归属网络私钥<br/>(永不外泄)"]
SUPI2["还原出 SUPI"]
SUCI2 -->|私钥解密| SUPI2
SK -.-> SUPI2
end
SUCI -->|空中发送| SUCI2
style SUPI fill:#ffd6d6,stroke:#c00
style SUCI fill:#fff2cc,stroke:#bf9000
style SK fill:#ffd6d6,stroke:#c00
它用的是一种叫 ECIES(椭圆曲线集成加密方案) 的公钥加密。工作机制是:
这就是 5G 给 IMSI Catcher 的"釜底抽薪"之计。下面这张对比表把代际演进讲清楚。
| 维度 | 2G/3G | 4G LTE | 5G NR |
|---|---|---|---|
| 永久身份 | IMSI | IMSI | SUPI |
| 初次发送 | 常明文 | 明文(仅后续用 GUTI 替换) | ECIES 加密成 SUCI |
| 伪基站抓取 | 易(IMSI Catcher 泛滥) | 仍可(明文窗口) | 极难(需破椭圆曲线) |
| 临时身份 | TMSI | GUTI | 5G-GUTI |
| 重放/跟踪抗性 | 弱 | 中 | 强(每次临时密钥) |
一个工程上的细节:5G 也保留了一个"空方案(null-scheme)"——当归属网络没预置公钥时,SUCI 就等于明文 SUPI。这是为了兼容性留的后门,生产网络必须部署 ECIES 公钥,否则 SUCI 保护形同虚设。这是网优和测试时一个常见踩坑点。
主认证解决的是"终端能不能接入 5G 核心网"。但很多场景下,业务方还想要更细的控制——比如企业专网、切片接入、第三方 DN(Data Network),它们希望用自己的逻辑再认证一次,确认"这个用户是我授权接入我这个网络的"。
这就是 二次认证(Secondary Authentication),基于 EAP-AKA' 协议,在 PDU 会话建立时触发。它与主认证最大的区别在于:主认证是 UE ↔ 核心网,二次认证是 UE ↔ 外部数据网络的 DN-AAA 服务器,AUSF 只是充当 EAP 的中继锚点。
flowchart TD
UE["终端 UE"] -->|"① 主认证 5G AKA"| CN["5G 核心网"]
CN -->|"② 已接入核心网"| SMF["SMF"]
SMF -->|"③ 建立PDU会话,<br/>触发二次认证"| AUSF["AUSF (EAP锚)"]
AUSF <-->|"④ EAP-AKA' 交互<br/>(经SMF转发)"| UE
AUSF <-->|"⑤ 与外部认证"| DNAAA["DN-AAA 服务器<br/>(数据网络侧)"]
DNAAA -->|"⑥ 认证成功"| SMF
style CN fill:#d9ead3,stroke:#38761d
style DNAAA fill:#fff2cc,stroke:#bf9000
为什么二次认证用 EAP-AKA' 而不是重新跑一遍 5G AKA?因为 EAP 是一个通用认证框架(你用企业 Wi-Fi 时的 802.1X 就是它),可扩展性好,能挂接各种认证方式。而 AKA' 那个"撇号"很关键——它在 KDF 里绑定了接入网络身份,防止中间人把认证响应搬运到别的接入网上重放。主认证是"进大楼",二次认证是"进某个具体办公室再刷卡",两者职责分明、互不替代。
密钥链还有一条专门为移动性设计的支线——当用户从一个 gNB 切到另一个 gNB 时,新基站怎么拿密钥?总不能每次切换都重做一次完整认证(那切换时延会爆炸)。
5G 的解法是 NH(Next Hop)/ NCC(Next Hop Chaining Counter) 机制,本质上还是密钥派生,只不过在基站间"预派生"一串密钥:
K_AMF 派生出 K_gNB,同时算出一个 NH 值。NH 进一步派生下一个基站的密钥,而不是暴露当前基站的密钥。NCC 就是个计数器,记录当前用了第几跳的密钥,防止重复使用和回退攻击。
这套密钥体系在现网调试中,最常见的几个场景:
认证失败排查:如果终端注册一直被拒,看是哪一步失败的。AUTN 验证失败(终端不信任网络)通常意味着卡里 K 与 UDM 不一致,或网络配置错误;RES* 比对失败则说明认证向量算错。抓包看 NAS 消息里的拒绝原因值是第一手线索。
SUCI 解不开:归属网络没部署 ECIES 私钥,或 USIM 卡里公钥与归属网络不匹配,会导致 SIDF 无法还原 SUPI,认证流程卡死。这是新开网/换卡时的高频问题。
安全模式命令(SMC)失败:K_AMF 派生的 NAS 密钥在 UE 和 AMF 两侧算出来对不上,通常是算法协商(UE 能力与网络配置不匹配)或密钥版本不一致。检查 SMC 消息里的安全算法 IE 是关键。
切换后掉话:NH/NCC 计数器不同步、或新旧 gNB 间密钥派生参数不一致,会导致切换后空口加密对不上、信令直接中断。这种问题在异厂商互操作时尤其常见。
一个直觉性的判断:只要涉及"加解密对不上",先把密钥派生链的两端(UE 侧和网元侧)对照一遍,确认它们用了相同的输入参数(SN-Name、算法标识、计数器)。80% 的安全类故障都出在"两端派生输入不一致"上。
Q1:K_SEAF 和 K_AMF 有什么本质区别?为什么不能合并?
A:K_SEAF 是移动性锚,跨 AMF 重定位时保持稳定,避免换 AMF 就重新认证;K_AMF 是当前 AMF 内的工作密钥,AMF 一变就重派生。两者作用域不同——一个负责"移动中不变",一个负责"当前服务内可用"。合并会牺牲移动性效率。
Q2:5G 既然有 SUCI 加密,IMSI Catcher 是不是彻底没用了? A:在部署了 ECIES 公钥的网络里,被动抓取 SUPI 几乎不可能。但攻击面并没有完全消失——伪基站仍可能强制把终端降级到"null-scheme"或诱导重传,部分旧卡/漫游场景也可能退化为弱保护。SUCI 大幅抬高了攻击成本,但不是绝对银弹。
Q3:二次认证(EAP-AKA')和企业 Wi-Fi 的 802.1X 是一回事吗? A:底层都是 EAP 框架,思想一致(UE 与外部认证服务器交互)。区别在于:5G 二次认证跑在 PDU 会话建立流程里、由 SMF/AUSF 中继,认证对象是数据网络;而 802.1X 跑在 Wi-Fi 链路层、由 AP/认证服务器中继。可以说它们是"同一套机制的两种部署"。
Q4:用户面完整性保护(KUPint)有什么用?加密不就够了吗? A:加密只防"看懂",完整性保护防"篡改"。没有完整性保护,攻击者即使看不懂内容,也可能翻转密文比特、注入垃圾数据,干扰业务甚至触发协议漏洞。5G 把 UP 完整性保护做成可选必选,是相对 4G 的实质安全增强,尤其保护控制类小流量业务。
Q5:每次认证都派生一堆新密钥,会不会很慢、很耗资源?
A:KDF 本质是几次哈希运算,开销极小,远小于一次 RSA/ECC 公钥运算。真正耗时的是认证交互的往返时延,而非密钥派生计算本身。这也是为什么系统宁可频繁派生子密钥,也要把昂贵的根密钥 K 用到极致。
本文由「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 等场景全覆盖。
