想象你走进一家酒店。前台需要确认两件事:你是你声称的那个人(验证身份),同时这家前台确实属于这家酒店而不是假冒的(验证网络真实性)。确认之后,前台给你一张房卡(密钥),此后你用房卡进出房间。
移动通信网络面临完全相同的问题——只不过在无线信道上,任何人都可以"偷听"。你的手机信号通过电磁波在空气中传播,攻击者只需要一个软件定义无线电(SDR)就能截获信号。如果没有安全机制:
从2G到5G,每一代移动通信都在不断强化安全体系。本文将聚焦4G/5G的安全核心——认证流程与密钥层级体系,帮你从直觉层面理解"为什么这样设计"。
移动通信安全围绕三个核心目标展开:
| 安全目标 | 含义 | 日常类比 |
|---|---|---|
| 机密性(Confidentiality) | 数据只能被合法方读取 | 用密封信封寄信,只有收件人能拆开 |
| 完整性(Integrity) | 数据在传输中未被篡改 | 快递包裹上有防拆封条 |
| 认证性(Authentication) | 确认通信双方身份真实 | 银行开户时的身份证核验 |
5G的安全并不是一个单一的"加密"操作,而是在协议栈的多个层级上分层实施的:
graph TB
subgraph "5G安全架构全景"
A["🔴 第1层:用户身份保护<br/>SUPI → SUCI加密"]
B["🟠 第2层:网络接入认证<br/>5G-AKA / EAP-AKA'"]
C["🟡 第3层:NAS信令安全<br/>NAS加密 + 完整性保护"]
D["🟢 第4层:AS接入安全<br/>RRC加密 + 完整性保护"]
E["🔵 第5层:用户面安全<br/>UP加密 + 完整性保护"]
end
A --> B --> C --> D --> E
style A fill:#ff6b6b,color:#fff
style B fill:#ff9f43,color:#fff
style C fill:#feca57,color:#333
style D fill:#48dbfb,color:#333
style E fill:#0abde3,color:#fff
为什么分层? 因为每一层保护的对象不同、威胁模型不同、实施位置也不同。比如NAS信令安全保护的是手机和核心网之间的控制消息,而AS接入安全保护的是手机和基站之间的无线链路。如果基站被攻破,NAS层的安全仍然有效——这就是纵深防御的思想。
在4G(LTE)及之前,用户的永久标识IMSI在首次附着时以明文方式在空口传输。这导致了著名的IMSI Catcher攻击(也叫Stingray攻击):
攻击者架设一个伪基站,广播比真基站更强的信号。手机优先接入伪基站后,伪基站要求手机发送IMSI——手机就乖乖地以明文把自己的"身份证号"发过去了。
这就像有人在酒店大堂冒充前台,大喊"请出示身份证",你就把身份证递过去了——连对方是不是真前台都没确认。
5G引入了SUPI(Subscription Permanent Identifier)取代IMSI,并规定:SUPI永远不在空口明文传输。取而代之的是,手机用运营商的公钥对SUPI进行加密,生成SUCI(Subscription Concealed Identifier)后发送。
SUCI的组成结构:
┌──────────┬──────────────┬──────────────┬────────────────┬──────────────┐
│ SUPI类型 │ 归属网络标识 │ 路由指示符 │ 保护方案标识 │ 加密输出 │
│ (1字节) │ (MCC+MNC) │ (Routing) │ (Scheme ID) │ (ECIES密文) │
└──────────┴──────────────┴──────────────┴────────────────┴──────────────┘
加密方案采用ECIES(椭圆曲线集成加密方案),其核心流程:
$$\text{SUCI} = \text{Enc}{PK, r \cdot G)$$}}(\text{SUPI
其中 $PK_{HN}$ 是归属网络的公钥,$r$ 是每次生成的随机临时私钥,$G$ 是椭圆曲线基点。由于每次都使用不同的 $r$,同一个SUPI加密后产生的SUCI每次都不同——这就是不可链接性(Unlinkability),攻击者无法通过比较两次SUCI来判断是否来自同一用户。
| 对比维度 | 4G(IMSI) | 5G(SUCI) |
|---|---|---|
| 空口传输 | 明文 | 公钥加密 |
| 伪基站防护 | 无效 | 有效(无法解密) |
| 不可链接性 | 无 | 有(每次加密结果不同) |
| 计算开销 | 无 | ECIES一次(<50ms) |
网络侧由SIDF(Subscription Identifier De-concealing Function)负责将SUCI解密为SUPI。SIDF位于UDM中,持有运营商的私钥,是全网唯一能执行解密操作的网元。
sequenceDiagram
participant UE as 手机(UE)
participant RAN as 基站(gNB)
participant AMF as AMF/SEAF
participant SIDF as SIDF/UDM
UE->>UE: 生成临时密钥对(r, r·G)<br/>用运营商公钥加密SUPI
UE->>RAN: 发送SUCI(加密后的SUPI)
RAN->>AMF: 转发SUCI
AMF->>SIDF: 转发SUCI
SIDF->>SIDF: 用私钥解密SUCI<br/>恢复出SUPI
SIDF-->>AMF: 返回SUPI
Note over UE,SIDF: 空口上只出现SUCI<br/>SUPI永远不会暴露
在4G中,只做了网络验证用户(你是合法用户吗?),但用户无法验证网络(这是合法基站吗?)。这就给了伪基站可乘之机。
5G引入了双向认证:不仅网络要验证用户的身份,用户也要验证网络的身份。
类比:你去银行取钱,柜员要查你的身份证(网络验用户),但你也应该确认这个窗口确实是银行的而不是骗子搭的(用户验网络)——5G补上了4G缺失的这半边。
| 网元 | 角色 | 类比 |
|---|---|---|
| UE(手机+USIM) | 持有根密钥K的客户端 | 你本人 + 你的身份证 |
| SEAF(安全锚点,位于AMF) | 服务网络的认证代理 | 酒店前台 |
| AUSF(认证服务器) | 归属网络的认证中心 | 酒店总部 |
| UDM/ARPF | 存储根密钥K的数据库 | 酒店总部的客户数据库 |
sequenceDiagram
participant UE as UE/USIM
participant SEAF as SEAF(AMF)
participant AUSF as AUSF
participant UDM as UDM/ARPF
UE->>SEAF: ① Registration Request<br/>(携带SUCI)
SEAF->>AUSF: ② Nausf_UEAuthentication Authenticate<br/>(SUCI + SN-name)
AUSF->>UDM: ③ Nudm_UEAuthentication Get<br/>(SUCI + SN-name)
Note over UDM: ④ 生成认证向量AV<br/>RAND, AUTN, XRES*, K_AUSF<br/>基于根密钥K计算
UDM-->>AUSF: ⑤ 返回AV<br/>(RAND, AUTN, XRES*, K_AUSF)
AUSF->>AUSF: ⑥ 计算HXRES* = SHA-256(XRES*)
AUSF-->>SEAF: ⑦ 返回(RAND, AUTN, HXRES*)
SEAF-->>UE: ⑧ Authentication Request<br/>(RAND, AUTN)
Note over UE: ⑨ USIM验证AUTN<br/>检查MAC和序列号SQN<br/>计算RES*和K_SEAF
UE-->>SEAF: ⑩ Authentication Response<br/>(RES*)
SEAF->>SEAF: ⑪ 计算HRES* = SHA-256(RES*)<br/>与HXRES*比对
alt HRES* == HXRES*
SEAF->>AUSF: ⑫ Nausf_UEAuthentication Confirm<br/>(RES*)
AUSF->>AUSF: ⑬ 比对RES*与XRES*
alt RES* == XRES*
AUSF-->>SEAF: ⑭ 认证成功 + K_SEAF
SEAF->>SEAF: ⑮ 从K_SEAF派生K_AMF
else
AUSF-->>SEAF: 认证失败
end
else
Note over SEAF: 本地验证失败
end
逐步解读这个流程:
步骤①-③:手机向网络发起注册,AMF收到后向AUSF请求认证,AUSF再向UDM请求认证向量。注意SEAF发送了SN-name(服务网络名称,如"5G:mnc070.mcc460.3gppnetwork.org"),这是5G新增的——归属网络可以据此判断请求来自哪个服务网络。
步骤④-⑤:UDM使用根密钥K生成认证向量(Authentication Vector)。这是整个认证的"题目": - RAND:一个128位随机数,作为"挑战"发给手机 - AUTN:认证令牌,包含序列号SQN和消息认证码MAC - XRES*:期望的响应值(手机应该算出来的"答案") - K_AUSF:给AUSF用的中间密钥
步骤⑥-⑦:AUSF对XRES*做哈希得到HXRES*,只把HXRES*(而非原始XRES*)发给SEAF。这样即使SEAF被攻破,攻击者也无法获得完整的XRES*。这是5G引入的安全锚点隔离机制。
步骤⑧-⑩:手机收到RAND和AUTN后,USIM用自己存的根密钥K进行计算: - 先验证AUTN中的MAC——确认这确实来自持有K的合法网络(用户验证网络) - 再检查SQN序列号是否在合理范围内——防止重放攻击 - 验证通过后,计算出RES*(自己的"答案")返回给网络
步骤⑪-⑭:两级验证——SEAF先本地快速比对哈希值,通过后再转发给AUSF做完整比对。这样设计的目的是减少不必要的信令交互。
步骤⑮:认证成功后,从K_AUSF开始逐级派生后续所有密钥。
在4G中,服务网络(拜访地)的MME自己就可以决定认证是否通过,归属网络(HSS)只提供认证向量但不验证结果。这意味着一个被攻破的拜访地网络可以绕过认证。
5G改变了这一设计:AUSF必须将认证结果确认回UDM,归属网络全程参与认证决策。这就是所谓的归属网络控制(Home Control)。
5G的密钥体系遵循三个核心原则:
$$K_{child} = \text{KDF}(K_{parent}, \text{FC} || P_0 || L_0 || P_1 || L_1 || ...)$$
其中FC是功能码(标识派生目的),$P_i$是参数,$L_i$是参数长度。KDF的本质是"加盐哈希"——不同的FC和参数确保不同用途的密钥互不相同。
graph TD
K["🔑 K<br/>根密钥<br/>(USIM ↔ UDM)<br/>128/256 bit"]
K -->|"AKA计算"| CK["CK (Cipher Key)"]
K -->|"AKA计算"| IK["IK (Integrity Key)"]
CK --> KDF1["KDF"]
IK --> KDF1
KDF1 --> KAUSF["K_AUSF<br/>AUSF密钥"]
KAUSF -->|"KDF + SN-name"| KSEAF["K_SEAF<br/>安全锚点密钥"]
KSEAF -->|"KDF + SUPI"| KAMF["K_AMF<br/>AMF主密钥"]
KAMF -->|"KDF"| KNASenc["K_NASenc<br/>NAS加密密钥"]
KAMF -->|"KDF"| KNASint["K_NASint<br/>NAS完整性密钥"]
KAMF -->|"KDF"| KgNB["K_gNB<br/>基站密钥"]
KgNB -->|"KDF"| KRRCenc["K_RRCenc<br/>RRC加密密钥"]
KgNB -->|"KDF"| KRRCint["K_RRCint<br/>RRC完整性密钥"]
KgNB -->|"KDF"| KUPenc["K_UPenc<br/>用户面加密密钥"]
KgNB -->|"KDF"| KUPint["K_UPint<br/>用户面完整性密钥"]
style K fill:#e74c3c,color:#fff
style KAUSF fill:#e67e22,color:#fff
style KSEAF fill:#f39c12,color:#fff
style KAMF fill:#27ae60,color:#fff
style KgNB fill:#3498db,color:#fff
style KNASenc fill:#9b59b6,color:#fff
style KNASint fill:#9b59b6,color:#fff
style KRRCenc fill:#1abc9c,color:#fff
style KRRCint fill:#1abc9c,color:#fff
style KUPenc fill:#34495e,color:#fff
style KUPint fill:#34495e,color:#fff
| 对比项 | 4G (LTE) | 5G (NR) |
|---|---|---|
| 根密钥 | K(128 bit) | K(128/256 bit) |
| 认证后首层密钥 | CK, IK → K_ASME | CK, IK → K_AUSF |
| 安全锚点 | K_ASME(在MME) | K_SEAF(在SEAF/AMF) |
| 核心网主密钥 | K_ASME直接使用 | K_AMF(从K_SEAF派生) |
| 用户面完整性保护 | 可选(多数未启用) | 强制启用 |
| 密钥层数 | 4层 | 5层(更细粒度隔离) |
| 最大算法密钥长度 | 128 bit | 256 bit(Rel-16+) |
5G为什么多了一层? 因为5G引入了SEAF作为安全锚点。SEAF位于服务网络(拜访地),AUSF位于归属网络。多一层K_SEAF意味着:即使服务网络的AMF被攻破,攻击者拿到的只是K_AMF及以下的密钥,无法推算出K_AUSF和K_SEAF,归属网络侧的安全不受影响。
| 密钥 | 持有者 | 保护对象 | 在哪一层生效 |
|---|---|---|---|
| K | USIM + UDM | 无直接使用,仅用于AKA计算 | USIM内部 |
| K_AUSF | AUSF + UDM | 用于派生K_SEAF | 核心网 |
| K_SEAF | SEAF + AUSF | 用于派生K_AMF | 核心网 |
| K_AMF | AMF + UE | 派生所有NAS和AS密钥 | NAS层 |
| K_NASenc/int | AMF + UE | NAS信令(注册、会话管理等) | NAS层 |
| K_gNB | gNB + UE | 派生所有空口密钥 | RRC/PDCP层 |
| K_RRCenc/int | gNB + UE | RRC信令(切换、测量报告等) | PDCP层 |
| K_UPenc/int | gNB + UE | 用户面数据(上网、通话等) | PDCP层 |
认证通过后,网络和手机需要协商使用什么加密和完整性保护算法:
| 算法ID | 加密算法(NEA) | 完整性算法(NIA) | 基础密码技术 |
|---|---|---|---|
| 0 | NEA0(空加密) | NIA0(空完整性) | 无保护 |
| 1 | NEA1(128- SNOW 3G) | NIA1(128- SNOW 3G) | 流密码 |
| 2 | NEA2(128- AES) | NIA2(128- AES-CMAC) | 分组密码 |
| 3 | NEA3(128- ZUC) | NIA3(128- ZUC) | 国密流密码 |
选算法的原则:网络侧有一张"优先级列表",按从高到低的顺序尝试,选择第一个双方都支持的算法。实际网络中绝大多数使用NEA2/NIA2(AES)。
安全模式协商分为NAS层和AS层两个阶段:
NAS Security Mode Command(AMF → UE): - AMF告知UE选用的NAS加密和完整性算法 - 同时携带UE的安全能力列表(防止"降级攻击"——攻击者伪造UE只支持弱算法) - UE验证后,此后的所有NAS信令都经过加密和完整性保护
AS Security Mode Command(gNB → UE): - gNB告知UE选用的RRC和用户面算法 - 此后RRC信令和用户面数据都受到保护
实战连接:在5G核心网调试中,如果手机注册失败且日志显示"Security Mode Reject",首先检查AMF和UE的算法列表是否有交集。常见的问题是测试USIM只支持部分算法,而AMF配置了强制使用特定算法——两边对不上就会握手失败。
在4G中,用户面数据的完整性保护是可选的,绝大多数运营商在实际部署中没有启用。原因很简单——完整性保护需要在每个数据包上附加一个MAC-I标签(通常4-8字节),这对高速数据传输有一定开销。
但这留下了一个安全漏洞:攻击者虽然无法解密数据(加密仍然生效),但可以篡改数据包的内容——比如修改你的银行转账金额、篡改网页内容。这就是所谓的"选择性明文篡改攻击"。
5G将用户面完整性保护提升为强制要求(个别场景除外):
$$\text{MAC-I} = \text{AES-CMAC}(K_{UPint}, \text{COUNT} | \text{BEARER} | \text{DIRECTION} | \text{PDU})$$
每个用户面PDU都附带一个MAC-I标签,接收方用相同的密钥和参数重新计算并比对。任何1个比特的篡改都会导致MAC-I不匹配,数据包被丢弃。
当手机从基站A切换到基站B时,基站B需要新的密钥。如果直接把K_gNB传给基站B,那么基站B不仅能解密切换后的数据,还能解密切换前在基站A上的数据——因为它们用的是同一套密钥。
5G(继承自4G)通过NH(Next Hop)参数链实现前向安全:
$$NH = \text{KDF}(K_{AMF}, NH_{prev})$$
每次切换时,使用最新的NH值来派生新基站的密钥:
$$K_{gNB_new} = \text{KDF}(NH, \text{target_PCI})$$
由于KDF是单向函数,新基站只能向前派生密钥,无法反推出旧基站使用的密钥。即使新基站被攻破,攻击者也无法解密用户在旧基站上传输过的数据。
除了5G-AKA,5G还支持EAP-AKA'作为替代认证协议。主要用于以下场景:
| 场景 | 推荐协议 | 原因 |
|---|---|---|
| 3GPP接入(NR/LTE) | 5G-AKA | 原生协议,效率最高 |
| 非3GPP接入(Wi-Fi) | EAP-AKA' | EAP框架天然支持 |
| 漫游场景 | 两者均可 | 取决于运营商配置 |
EAP-AKA'的核心区别在于密钥派生时绑定了服务网络名称:
$$CK' | IK' = \text{KDF}(CK | IK, \text{"EAP-AKA'"} | \text{SN-name})$$
这一绑定确保了:即使攻击者截获了CK/IK,也无法在不同的服务网络下重用——因为SN-name不同,派生出的密钥也不同。
| 故障现象 | 可能原因 | 排查方法 |
|---|---|---|
| Authentication Reject | USIM和UDM的根密钥K不一致 | 比对SIM卡和HSS/UDM中的Ki |
| MAC Failure | AUTN验证失败,可能是SQN不同步 | 检查USIM的SQN计数器与UDM是否对齐 |
| SUCI解析失败 | 运营商公私钥对不匹配 | 确认USIM中预置的公钥与UDM私钥是同一对 |
| Security Mode Reject | 算法协商无交集 | 检查AMF和UE的安全能力列表 |
| TAU/Registration循环 | K_AMF派生异常 | 检查KDF参数(特别是SUPI、AMF实例ID) |
在实际调测中,重点关注以下消息:
SQN不同步是最容易被忽略的问题。USIM内部维护一个计数器SQN(Sequence Number),UDM也维护一个。如果USIM的SQN超前(比如长时间不联网后又开机),AUTN中的SQN可能落在USIM的"可接受窗口"之外,导致认证失败。
此时USIM会返回一个AUTS(Synchronization Token),UDM收到后重新同步SQN再重试。如果现网中频繁出现AUTS消息,需要检查UDM的SQN管理策略是否合理。
Q: 5G-AKA和EAP-AKA'到底选哪个? A: 对于3GPP接入(NR基站),默认使用5G-AKA,它更高效(信令交互更少)。对于非3GPP接入(如Wi-Fi calling、可信WLAN接入),使用EAP-AKA',因为EAP框架天然适配这类接入方式。运营商也可以在UDM中为特定用户配置使用EAP-AKA'。
Q: NEA0(空加密)在什么场景下使用? A: 主要用于紧急呼叫(Emergency Call)。当用户没有USIM或认证失败时,法律要求仍然允许拨打紧急电话。此时没有密钥可用,只能使用NEA0。在正常商业网络中,运营商应配置为禁止NEA0。
Q: 为什么不直接用根密钥K加密,而要派生这么多层密钥? A: 核心原因是最小化泄露影响。如果直接用K加密且K泄露,攻击者可以解密所有历史通信——因为K从不变化。而多层密钥体系中,每个会话、每个网元使用不同的派生密钥,即使某一层的密钥泄露,上层密钥和过去的通信仍然安全。这就像银行不会把金库主钥匙给每个柜员,而是给每个柜员一把只能开自己保险箱的子钥匙。
Q: 5G能完全防止伪基站攻击吗? A: 不能完全防止,但大幅增加了攻击难度。5G的SUCI让伪基站无法获取用户真实身份;双向认证让用户可以验证网络身份。但伪基站仍然可以发起拒绝服务(拒绝UE接入),或在某些降级攻击场景下将5G终端降级到4G/3G后利用旧协议漏洞。安全是一个持续攻防的过程。
Q: 切换时密钥更新会不会增加延迟? A: 密钥派生本身是纯计算操作(一次SHA-256),耗时在微秒级,对切换延迟的影响可以忽略。实际影响切换延迟的主要因素是无线测量报告传输、Xn/Uu接口信令交互、数据转发等,密钥派生不在关键路径上。
本文由「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 等场景全覆盖。
