你有没有想过,当你拨出一通电话、刷着短视频,或者用手机银行转账时,空中飞舞的电磁波里藏着什么?你的密码、你的身份、你的银行账号——全部化作了0和1,在基站和手机之间裸奔吗?当然不是。在你和基站之间,有一套精密到令人叹为观止的安全体系在默默运转。今天,我们就来拆解这套体系——5G认证与密钥层级——看看它是如何被设计出来的,又为什么必须这样设计。
在讲原理之前,先理解一个真实的安全威胁。
假设你是一个攻击者,花几百块钱买了一个软件定义无线电(SDR)设备,在闹市区架设一个伪装基站。当路人的手机搜到这个"基站"信号更强时,就会主动连接过来。此时你发送一条指令:"请发送你的IMSI"。在4G网络中,手机很可能老老实实地把自己的IMSI(国际移动用户识别码,15位数字)用明文发过来。
这就是IMSI Catcher(伪基站)攻击。 拿到IMSI后,攻击者可以追踪你的位置、记录你的通信,甚至实施中间人攻击。
为什么4G会这么"天真"?因为在4G的设计时代(2008年前后),移动通信安全的主要威胁模型还集中在核心网内部,而非空口(无线电接口)上的主动攻击者。4G规范虽然引入了GUTI(临时标识)来减少IMSI明文传输的频率,但在初次附着、网络请求等场景下,IMSI仍然可能以明文暴露。
5G的设计者痛定思痛:永远不再在空口传输永久标识的明文。 这个决策,引发了整个认证和密钥体系的重新设计。
5G用SUPI(Subscription Permanent Identifier)取代了4G的IMSI。本质上它还是一个永久标识——由MCC(移动国家码)+ MNC(移动网络码)+ MSIN(移动用户识别号)组成。但关键区别在于:SUPI永远不应该在空口上以明文出现。
5G引入了SUCI(Subscription Concealed Identifier),可以理解为"加密后的SUPI"。
想象一下:SUPI是一封信,SUCI就是把信装进一个只有你家(归属网络)才能打开的保险信封里。即使中途有人截获了这个信封,他也看不到里面的内容。
SUCI的加密采用的是ECIES(椭圆曲线集成加密方案)。它的工作流程如下:
sequenceDiagram
participant USIM as USIM卡<br/>(存储运营商公钥)
participant UE as 手机
participant RAN as 伪基站?
participant AMF as AMF/SEAF
participant UDM as UDM/SIDF<br/>(存储运营商私钥)
Note over USIM,UDM: 预先配置:运营商的公私钥对
USIM->>UE: 读取公钥Pk和密钥ID
UE->>UE: 生成临时密钥对(ephemeral)<br/>用Pk加密SUPI
UE->>RAN: 发送SUCI(加密后的SUPI)
Note over RAN: 即使是伪基站<br/>也无法解密SUCI!
RAN->>AMF: 转发SUCI
AMF->>UDM: 转发SUCI
UDM->>UDM: SIDF用私钥Sk<br/>解密SUCI→得到SUPI
UDM->>AMF: 返回SUPI和认证向量
ECIES的核心思路: - 运营商在USIM卡里预置一个公钥(Pk) - 运营商的核心网(UDM)保存对应的私钥(Sk) - 每次注册时,UE生成一个临时密钥对,用公钥Pk加密SUPI - 只有UDM的SIDF(去隐藏功能)能用私钥Sk还原SUPI
这意味着,即便是伪装成基站的攻击者截获了SUCI,没有私钥也无法还原SUPI。 这是5G相比4G最根本的安全改进之一。
SUCI的完整结构如下表所示:
| 字段 | 说明 | 示例 |
|---|---|---|
| SUPI Type | 标识类型 | 0=IMSI格式 |
| Home Network ID | 归属网络标识 | MCC=460, MNC=00 |
| Routing Indicator | 路由指示 | 用于路由到正确UDM |
| Protection Scheme | 加密方案标识 | 0=null, 1=ECIES |
| Home Network PK ID | 公钥标识 | 标识使用哪个公钥版本 |
| Scheme Output | 加密输出 | 密文+MAC值 |
工程注意: 网络可以配置"null scheme"(空加密方案),此时SUCI中直接包含明文SUPI。这通常用于漫游场景或早期部署阶段。在现网调试中,如果抓包看到明文SUPI,首先要确认是否配置了ECIES方案。
在解释技术之前,先理解认证的本质。
想象你去银行取钱:
移动通信中的AKA(Authentication and Key Agreement)就是这样一个双向认证过程:网络确认"你是你说的那个用户",用户也确认"你是我签约的那个网络"。
在讲5G之前,先快速理解4G的认证流程,因为5G是在4G基础上演进的:
sequenceDiagram
participant UE as UE
participant MME as MME
participant HSS as HSS/AuC
UE->>MME: Attach Request (含IMSI/GUTI)
MME->>HSS: Authentication Information Request (IMSI)
HSS->>HSS: 用长期密钥K + RAND<br/>生成认证向量AV(RAND, AUTN, XRES, KASME)
HSS->>MME: 返回多个AV
MME->>UE: Authentication Request (RAND, AUTN)
UE->>UE: 用USIM中的K验证AUTN<br/>计算RES
UE->>MME: Authentication Response (RES)
MME->>MME: 比较RES和XRES<br/>匹配则认证成功
4G的EPS-AKA流程有一个根本缺陷:IMSI在第一步就可能以明文传输。 这给了IMSI Catcher可乘之机。
5G的认证流程在4G基础上做了三个关键改进:
完整流程如下:
sequenceDiagram
participant UE as UE/USIM
participant SEAF as SEAF(AMF)
participant AUSF as AUSF
participant UDM as UDM/ARPF/SIDF
UE->>SEAF: ① Registration Request<br/>(SUCI或5G-GUTI)
Note over SEAF: AMF没有安全上下文<br/>需要触发认证
SEAF->>AUSF: ② Nausf_UEAuthentication<br/>(SUCI, SN-name)
AUSF->>UDM: ③ Nudm_UEAuthentication<br/>(SUCI→SIDF解密→SUPI)
Note over UDM: ARPF用长期密钥K<br/>生成认证向量AV<br/>(RAND, AUTN, XRES*, K_AUSF)
UDM->>AUSF: ④ 返回(RAND, AUTN, XRES*, K_AUSF)
Note over AUSF: 计算HXRES*=SHA256(XRES*)<br/>派生K_SEAF
AUSF->>SEAF: ⑤ 返回(RAND, AUTN, HXRES*, K_SEAF)
SEAF->>UE: ⑥ Authentication Request<br/>(RAND, AUTN)
Note over UE: USIM用K验证AUTN<br/>检查SQN防止重放<br/>计算RES*
UE->>SEAF: ⑦ Authentication Response (RES*)
Note over SEAF: 计算HRES*=SHA256(RES*)<br/>与HXRES*比较
SEAF->>AUSF: ⑧ 转发RES*
Note over AUSF: 比较RES*与XRES*<br/>完全匹配则认证成功
AUSF->>SEAF: ⑨ 认证确认 + K_SEAF确认
SEAF->>UE: ⑩ Security Mode Command<br/>(安全算法协商)
UE->>SEAF: ⑪ Security Mode Complete
第①步: UE发送注册请求,身份标识用SUCI(加密的)或5G-GUTI(临时标识)。SUPI明文永远不会出现在空口上。
第②步: AMF作为SEAF(安全锚点功能),将请求转发给归属网络的AUSF。注意,这里携带了SN-name(服务网络名称),格式类似 5G:mnc070.mcc901.3gppnetwork.org。这个字段至关重要——它让归属网络知道是谁在请求认证。
第③-④步: UDM内部的SIDF解密SUCI得到SUPI,然后ARPF(认证凭据仓库和处理功能)用长期密钥K生成认证向量。关键的增强是XRES*:它是4G XRES的扩展版本,通过追加一个哈希值来防止"截断攻击"——攻击者无法只截取RES的前半部分来通过验证。
第⑤步: AUSF不直接把XRES给SEAF,而是给HXRES*(XRES的哈希)。这是一个安全隔离措施:服务网络只需验证哈希值,不需要知道完整的期望响应。
第⑥步: SEAF把RAND(随机挑战)和AUTN(认证令牌)发给UE。AUTN里包含一个序列号SQN。
第⑦步: UE的USIM用存储的长期密钥K来: - 验证AUTN:确认"这个挑战确实来自我的归属网络" - 检查SQN:确保"这个挑战是新鲜的,不是重放的" - 计算RES*:作为应答
第⑧-⑨步: 双重验证。SEAF先本地比对HRES和HXRES(快速初筛),再由AUSF做最终精确比对。
AUTN是网络向UE证明自己身份的令牌。它的内部包含:
| 字段 | 长度 | 说明 |
|---|---|---|
| SQN ⊕ AK | 48 bit | 序列号异或匿名密钥 |
| AMF | 16 bit | 认证管理字段 |
| MAC-A | 64 bit | 消息认证码 |
UE收到AUTN后,用密钥K和RAND重新计算MAC-A,与收到的MAC-A比对。如果一致,说明这个挑战确实来自持有密钥K的网络。同时检查SQN(序列号),如果SQN比上次收到的小,说明可能是重放攻击,UE会拒绝认证并启动同步失败流程。
认证通过后,接下来就是密钥协商——双方要派生出一套用于加密和完整性保护的会话密钥。
你可能会问:既然认证时已经有了共享密钥K,为什么不直接用K来加密通信?
原因至少有三个:
所以5G采用了层级密钥派生——就像酒店的主钥匙体系:总经理有一把总钥匙,楼层经理有本层的钥匙,每个房间还有独立的门卡。任何一把门卡丢失,只需要换这个房间的锁,不需要换整栋楼的锁。
graph TD
K["<b>K</b><br/>长期密钥<br/>(USIM + UDM)<br/>128/256 bit"]
K --> CK_IK["<b>CK || IK</b><br/>密码密钥 + 完整性密钥<br/>由K+RAND派生"]
CK_IK --> CKp_IKp["<b>CK' || IK'</b><br/>绑定服务网络上下文<br/>KDF(CK‖IK‖SQN‖SN_ID)"]
CKp_IKp --> K_AUSF["<b>K_AUSF</b><br/>归属网络锚点密钥<br/>存储在AUSF"]
K_AUSF --> K_SEAF["<b>K_SEAF</b><br/>服务网络锚点密钥<br/>KDF(K_AUSF‖SUPI‖...)"]
K_SEAF --> K_AMF["<b>K_AMF</b><br/>AMF密钥<br/>KDF(K_SEAF‖SUPI‖ABBA)"]
K_AMF --> K_NAS_enc["<b>K_NASint</b><br/>NAS完整性密钥"]
K_AMF --> K_NAS_int["<b>K_NASenc</b><br/>NAS加密密钥"]
K_AMF --> KgNB["<b>KgNB</b><br/>基站密钥"]
K_AMF --> K_AMF_star["<b>K_AMF*</b><br/>移动性密钥<br/>(切换用)"]
KgNB --> K_RRC_enc["<b>K_RRCenc</b><br/>RRC加密密钥"]
KgNB --> K_RRC_int["<b>K_RRCint</b><br/>RRC完整性密钥"]
KgNB --> K_UP_enc["<b>K_UPenc</b><br/>用户面加密密钥"]
KgNB --> K_UP_int["<b>K_UPint</b><br/>用户面完整性密钥"]
style K fill:#ff6b6b,color:#fff
style CK_IK fill:#ffa94d,color:#fff
style K_AUSF fill:#845ef7,color:#fff
style K_SEAF fill:#339af0,color:#fff
style K_AMF fill:#20c997,color:#fff
style KgNB fill:#fcc419,color:#333
第一层:K(长期密钥) - 存储在USIM和UDM的AuC(认证中心)中 - 是整个安全体系的根基,永远不会在空口传输 - 通常为128位,5G支持扩展到256位
第二层:CK、IK(基础会话密钥) - CK(Cipher Key)用于加密 - IK(Integrity Key)用于完整性保护 - 由K和RAND通过密码学函数派生:$$CK \parallel IK = f_K(RAND)$$
第三层:CK'、IK'(绑定上下文的密钥) - 5G新增的安全措施,将CK/IK与服务网络身份绑定: $$CK' \parallel IK' = \text{KDF}_{\text{CK}\parallel\text{IK}}(\text{SQN} \oplus \text{AK} | \text{SN_ID})$$ - 这样做的好处:即使CK/IK被泄露,攻击者也无法在另一个网络中重用
第四层:K_AUSF(归属网络锚点密钥) $$K_{\text{AUSF}} = \text{KDF}(\text{CK}' \parallel \text{IK}', \text{P0}=\text{SN_ID}, \text{L0}=\text{length})$$ - 停留在归属网络,不会发送给服务网络 - 用于跨系统移动时的安全锚点
第五层:K_SEAF(服务网络锚点密钥) $$K_{\text{SEAF}} = \text{KDF}(K_{\text{AUSF}}, \text{P0}=\text{SUPI}, \text{P1}=\text{ABBA})$$ - 由AUSF发送给SEAF(AMF) - ABBA参数用于防回退保护,防止攻击者迫使系统使用弱安全参数
第六层:K_AMF(AMF密钥) $$K_{\text{AMF}} = \text{KDF}(K_{\text{SEAF}}, \text{SUPI}, \text{ABBA})$$ - AMF使用此密钥派生所有下级密钥 - 这是NAS层安全的直接基础
第七层:NAS密钥 + KgNB - K_NASenc:NAS信令加密 - K_NASint:NAS信令完整性保护 - KgNB:传递给基站,用于RRC和用户面保护
第八层:RRC和用户面密钥 - K_RRCenc:RRC信令加密 - K_RRCint:RRC信令完整性保护 - K_UPenc:用户面数据加密 - K_UPint:用户面数据完整性保护
5G新增亮点: 在4G中,用户面数据完整性保护(K_UPint)不是强制的。但在5G中,用户面完整性保护成为必选功能。这是因为在物联网场景中,即使数据被加密,攻击者仍然可以通过翻转密文比特来篡改控制指令(如开关阀门),完整性保护可以防止这类攻击。
| 安全特性 | 4G (EPS-AKA) | 5G (5G-AKA) | 改进意义 |
|---|---|---|---|
| 用户标识保护 | IMSI可能明文传输 | SUPI永远加密为SUCI | 消除IMSI Catcher威胁 |
| 加密算法 | ECIES未标准化 | 标准化ECIES方案 | 互操作性和安全性提升 |
| 用户面完整性 | 可选 | 强制 | 防止数据篡改 |
| 锚点密钥 | K_ASME | K_SEAF(更深层级) | 更好的密钥隔离 |
| 服务网络认证 | 弱(MME自行验证) | 归属网络验证服务网络 | 防止伪基站 |
| 认证响应 | XRES(可能被截断) | XRES*(含哈希扩展) | 防止截断攻击 |
| 伪基站防护 | 依赖UE实现 | 网络侧强制验证 | 系统级安全 |
| 回退保护 | 无 | ABBA参数 | 防止降级攻击 |
| 密钥长度 | 128 bit | 128/256 bit | 抗量子计算准备 |
在现网调试中,安全相关的问题通常表现为:
Registration Reject,Cause值为 3 或 5GMM cause #23(安全模式拒绝)Authentication Reject 或 Authentication Failure(带错误码:MAC failure=20, Sync failure=21)调试要点: - 检查USIM和UDM中的长期密钥K是否一致(最常见的认证失败原因) - 检查SQN同步(如果UE长时间关机,SQN可能不同步) - 检查SUCI是否正确加密(null scheme vs ECIES)
误解1:"5G使用SUCI,所以不可能被追踪。"
事实:SUCI只在初次注册时使用。注册成功后,网络会分配5G-GUTI作为临时标识。后续通信使用5G-GUTI。如果攻击者持续监控,可以通过关联SUCI→5G-GUTI的映射来追踪。此外,流量模式分析(数据包大小、时间间隔)也可能泄露信息。SUCI大幅提高了追踪难度,但并非完全消除。
误解2:"K_SEAF和K_ASME一样,只是换了名字。"
事实:虽然概念类似(都是服务网络的锚点密钥),但K_SEAF的派生链更长、参数更多,绑定了SUPI和ABBA,提供了更强的安全隔离。
误解3:"5G认证完成后,所有数据都是加密的。"
事实:5G支持多种加密算法(NEA0/1/2/3),其中NEA0是空加密。虽然规范要求尽量使用加密算法,但在某些漫游场景或紧急呼叫中,可能使用NEA0。在抓包时需要确认实际协商的算法。
| 算法标识 | 名称 | 类型 | 说明 |
|---|---|---|---|
| NEA0 | 空加密 | 加密 | 不加密,仅用于特定场景 |
| NEA1 | 128-EEA1 | 加密 | 基于SNOW 3G |
| NEA2 | 128-EEA2 | 加密 | 基于AES |
| NEA3 | 128-EEA3 | 加密 | 基于ZUC(祖冲之算法) |
| NIA0 | 空完整性 | 完整性 | 不保护,仅用于特定场景 |
| NIA1 | 128-EIA1 | 完整性 | 基于SNOW 3G |
| NIA2 | 128-EIA2 | 完整性 | 基于AES |
| NIA3 | 128-EIA3 | 完整性 | 基于ZUC |
注意NEA3/NIA3: ZUC算法是中国自主研发的密码算法,已纳入3GPP国际标准。在中国运营商的网络中,ZUC算法是默认使用的加密和完整性保护算法。
当UE从一个基站切换到另一个基站时,密钥也需要更新,否则攻击者可能通过获取旧密钥来解密新基站的通信。
5G使用水平密钥派生来解决这个问题:
$$K_{\text{gNB}}^{*} = \text{KDF}(K_{\text{gNB}}, \text{target_gNB_ID})$$
每次切换时,当前gNB基于自己的KgNB和目标gNB的ID派生新的KgNB给目标gNB。这个过程形成一个密钥链*:
K_AMF → KgNB_0 → KgNB_1 → KgNB_2 → ... → KgNB_n
(初始) (第1次切换) (第2次切换) (第n次切换)
为了防止密钥链无限延长导致的安全降级,5G还引入了最大水平链长度限制。当链长度达到阈值时,会触发一个新的垂直密钥派生(从K_AMF重新开始)。
| 类型 | 含义 | 5G实现 |
|---|---|---|
| 前向安全 | 新基站无法解密旧基站的通信 | 每次切换派生新密钥,旧密钥不传递 |
| 后向安全 | 旧基站无法解密新基站的通信 | 需要额外机制,5G在特定场景下支持 |
把认证和密钥派生放在一起,整个安全建立过程是:
1. UE发送注册请求(携带SUCI)
↓
2. 网络触发5G-AKA认证
- 互相验证身份
- 派生K_SEAF → K_AMF
↓
3. AMF向UE发送Security Mode Command
- 协商加密/完整性算法
- 激活NAS安全(K_NASenc, K_NASint)
↓
4. UE回复Security Mode Complete(已加密+完整性保护)
↓
5. AMF向gNB发送UE Context Setup
- 传递KgNB和算法列表
↓
6. gNB向UE发送RRC Security Mode Command
- 激活RRC和用户面安全
↓
7. 安全通道建立完成,开始正常通信
注意这个顺序:NAS安全先于RRC安全。这是因为NAS消息(UE到AMF)的加密在AMF中终结,而RRC消息(UE到gNB)的加密在gNB中终结。AMF先建立安全通道,然后才把密钥材料传递给gNB,形成了一个从核心到边缘的安全建立顺序。
Q1: SUCI每次注册都会变吗?
A: 是的。因为ECIES每次都会生成一个新的临时密钥对,即使SUPI完全相同,每次产生的SUCI密文也不同。这意味着攻击者无法通过比较SUCI来判断两次注册是否来自同一用户。
Q2: 5G-AKA和EAP-AKA'有什么区别?
A: 5G-AKA是5G原生的认证协议,由网络(SEAF)主动发起;EAP-AKA'是基于EAP框架的认证协议,通常用于非3GPP接入(如WiFi)场景。两者都能达到相似的安全效果,但信令流程不同。EAP-AKA'需要更多的往返消息(EAP-Request/Response交互),但更灵活,支持多种接入技术。
Q3: 如果USIM中的密钥K被泄露了怎么办?
A: K是整个安全体系的根基。如果K泄露,攻击者可以伪装成合法用户接入网络,也可以解密所有通信。运营商需要立即在UDM中更新K,并更换用户的USIM卡。这也是为什么K只存储在USIM的安全硬件和运营商的认证中心(AuC)中,不在任何中间节点存储。
Q4: 为什么需要HXRES*这个中间步骤?
A: HXRES是AUSF给SEAF的XRES哈希值。SEAF(在服务网络)不需要知道完整的XRES,只需验证UE返回的RES的哈希是否匹配。这种设计确保了:即使服务网络被攻破,攻击者也无法获得完整的XRES来伪装成UE攻击其他网络。这是最小知识原则*的体现。
Q5: SQN同步失败是怎么回事?
A: SQN(序列号)用于防止重放攻击。USIM和UDM各自维护一个SQN计数器。如果UE长期关机或USIM被换到其他设备,USIM中的SQN可能落后于UDM的SQN。当UE收到一个SQN比自己记录的更旧的AUTN时,会认为可能是重放攻击并拒绝认证,同时发起同步失败流程。UDM收到同步失败后会重新同步SQN。
本文由「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 等场景全覆盖。
