你有没有想过一个问题:手机开机到上网,中间那几秒钟到底发生了什么?信号格亮起来之前,你的手机和网络其实完成了一场严格的“身份互查”——手机要证明“我是我”,网络也要证明“我不是骗子”。这套机制叫认证与密钥协商(AKA,Authentication and Key Agreement),它是整个移动通信安全的发动机。
这篇文章我们把它拆开看:为什么2G时代满街的“伪基站”能骗过手机?4G/5G用什么办法堵上了这些漏洞?一把藏在SIM卡里的根密钥,是如何长成一整棵“密钥树”的?看完你会发现,5G安全性的提升,靠的不是什么神秘新算法,而是一套非常精巧的架构设计。
先讲一个生活中的类比。你住的小区门禁是这样工作的:保安看到你,你出示门禁卡,保安刷一下,绿灯亮,放行。注意——只有你向小区证明了身份,小区从没向你证明过“它真的是你们小区”。
2G网络的认证就是这个模式:网络验证手机(通过SIM卡),但手机无条件相信任何向它发信号的网络。攻击者架一台功率够大的假基站,广播“我是你的运营商”,手机就会乖乖接入,把明文的IMSI(相当于你的身份证号)交出去,随后你的短信验证码、通话内容都可能被截获。这就是伪基站诈骗的技术根源。
4G引入了双向认证:手机也要验证网络。5G则补上了最后一块短板:连你的身份标识本身都不再明文出现在空口。这三个层层递进的设计——双向认证、身份隐藏、密钥分级——构成了现代移动网络安全的主干。
整套体系的起点简单得出奇:USIM卡里烧录了一把根密钥 K,运营商归属网络的核心网数据库里存着同一把 K。 除此之外,世界上没有任何地方有这把钥匙。
两条铁律贯穿始终:
为什么这样设计?这是密码学里最朴素也最深刻的道理:密钥每多出现一个地方,泄露面就大一圈。把秘密压缩到两个物理上隔离的端点(一张防物理攻击的智能卡 + 一个受控的归属网机房),中间的所有网络节点——无论漫游到国外的访问网络,还是路边那个基站——永远接触不到根密钥,只接触从它派生出来的“一次性工牌”。
当手机要接入网络,归属网络不会直接把 K 拿出来用,而是先“出题”。它生成一组数据,业内俗称认证五元组(认证向量):
| 参数 | 全称 | 作用 | 由谁持有 |
|---|---|---|---|
| RAND | 随机数(128位) | 出给手机的“考题”,每次全新 | 全程明文传输 |
| AUTN | 认证令牌(128位) | 网络的“自证信物”,手机用来验证网络 | 全程明文传输 |
| XRES | 期望应答 | 网络留存的“标准答案”,与手机回传的RES比对 | 只留在网络侧 |
| CK | 加密密钥(128位) | 后续加密通信的原料 | 派生使用,不出归属网 |
| IK | 完整性密钥(128位) | 后续防篡改校验的原料 | 派生使用,不出归属网 |
这套机制基于对称密码:手机和网络共享同一把 K,各自对同一个 RAND 做同样的运算,结果对得上,就证明“我们手里有同一把钥匙”。典型的算法族叫 Milenage,核心是几个函数:
$$ RES = f2_K(RAND), \quad CK = f3_K(RAND), \quad IK = f4_K(RAND) $$
$$ MAC = f1_K(SQN | RAND | AMF), \quad AK = f5_K(RAND) $$
而网络发给手机的自证信物 AUTN,就是这三样东西拼起来的:
$$ AUTN = (SQN \oplus AK) \;|\; AMF \;|\; MAC $$
sequenceDiagram
participant U as 手机/USIM
participant S as 服务网络(AMF/SEAF)
participant A as 认证服务(AUSF)
participant H as 归属网(UDM+密钥库)
U->>S: 接入请求(携带加密身份SUCI)
S->>A: 发起认证
A->>H: 请求认证数据
H->>H: 用根密钥K生成五元组<br/>RAND/AUTN/XRES/CK/IK
H->>A: 返回认证数据(锚定密钥)
A->>S: 下发RAND+AUTN
S->>U: 认证挑战(RAND, AUTN)
U->>U: USIM用K计算:<br/>验MAC? 验SQN新鲜度?
alt 网络验证通过
U->>S: 回传RES
S->>A: 转交RES
A->>A: 比对RES与XRES
A->>S: 认证成功+锚定密钥确认
S->>U: 进入安全模式(派生通信密钥)
else MAC不对(网络是假的)
U->>S: 拒绝(Authentication Reject)
else SQN序列号异常
U->>S: 同步失败(携带AUTS)
S->>H: 重新同步序列号后重试
end
这场“对暗号”里藏着两个精妙的防攻击设计:
防重放:SQN序列号。 攻击者就算录下一次合法的挑战应答,回放给手机也是没用的——因为AUTN里藏着一个不断递增的序列号SQN,USIM卡里记着自己见过的最新值。旧题重考,立刻识破。如果两边序列号意外错位(比如换卡、数据回滚),手机不直接拒绝,而是回一个带AUTS参数的“同步失败”,让归属网重新对齐后重试——既安全又不误伤。
双向验证:AUTN与RES各管一边。 手机验AUTN的MAC,等于网络证明了“我有K”;网络比对RES与XRES,等于手机证明了“我也有K”。一把钥匙,两个方向各出一道证明,缺一不可。
解决了“假网络”问题,还剩“偷看名字”问题。4G及之前,手机初始接入时发出的IMSI是明文的,空口抓包就能拿到,追踪一个人的行踪不需要攻破任何加密。
5G的解法是把身份标识拆成两层:
这个加密用的正是密码学里经典的 ECIES(椭圆曲线集成加密方案)。它的流程值得细看:
flowchart TD
subgraph 手机侧加密
A1[取出归属运营商公钥] --> A2[生成一次性临时密钥对 r]
A2 --> A3[ECDH计算共享秘密 S=r·公钥]
A3 --> A4[KDF派生加密密钥与MAC密钥]
A4 --> A5[用对称加密封装SUPI]
A5 --> A6[输出: 临时公钥rG + 密文 + MAC校验码]
end
subgraph 归属网侧解密
B1[收到临时公钥rG] --> B2[用自己的私钥k计算<br/>S=k·rG = r·kG 与手机侧相同]
B2 --> B3[同一KDF派生出相同密钥]
B3 --> B4[解密还原SUPI]
end
A6 -- SUCI经基站/访问网络透传 --> B1
手机侧:用归属运营商的公钥加密SUPI,同时生成一对只用一次就丢弃的临时密钥(记为 r),把临时公钥 rG 一起塞进信封。
归属网侧:用自己的私钥 k 和收到的 rG 做一次椭圆曲线运算,就能得到和手机侧完全相同的共享秘密(因为 $k \cdot rG = r \cdot kG = rkG$,这就是 Diffie–Hellman 的巧妙之处——两边从未传输过任何共享秘密本身,却能各自算出同一个值),再派生出解密密钥拆信封。
为什么必须用一次性临时密钥对,而不是直接用公钥加密? 两个原因:一是同样的SUPI每次加密出来的SUCI都不同,偷窥者无法通过“密文长得一样”来关联追踪;二是临时私钥用完即弃,即使未来某天归属网私钥意外泄露,历史抓包数据依然安全(前向保护)。基站和访问网络全程只见到密文——它们既解不开,也不需要解开。
认证成功只是拿到了“入场券”。接下来真正保护你通话和数据的,是一整套逐级派生的密钥体系。这是5G安全架构中最值得工程师理解的部分。
先看一个4G时代的教训。在4G的EAP-AKA机制里,认证产生的 CK/IK 曾经会被分发到访问网络的节点使用。IETF在定义改进版 EAP-AKA' 时写下了明确的设计动机:绑定接入网络的名称来派生新密钥,且要求中间密钥(CK/IK)绝不允许离开归属签约系统——因为历史上这些密钥散落在访问网络中,一个节点被攻破,攻击者就能拿密钥冒充接入点。
5G把这个思想制度化:归属网在认证后只向服务网络下发一个锚定密钥(K_AUSF),访问网络侧再派生出自己用的服务网密钥(K_SEAF)。层层往下,每级只拿到自己那一级的“工牌”,谁也见不到别人的,更见不到根密钥。
flowchart TD
K["根密钥 K<br/>(USIM与归属网共享,永不出卡/不出归属网)"]
KA["锚定密钥 K_AUSF<br/>(归属网→认证服务级)"]
KS["服务网密钥 K_SEAF<br/>(接入网络可见的最高级密钥)"]
KM["AMF级密钥 K_AMF"]
KN1["NAS加密密钥"]
KN2["NAS完整性密钥"]
KG["基站级密钥 K_gNB"]
KR1["RRC加密密钥"]
KR2["RRC完整性密钥"]
KU["用户面加密密钥"]
NH["NH链:每次切换注入新鲜随机数<br/>派生新K_gNB,前后向隔离"]
K -->|"归属网内派生(不出归属网)"| KA
KA -->|"认证成功后下发给服务网络"| KS
KS -->|"注册/移动性管理更新时派生"| KM
KM --> KN1
KM --> KN2
KM -->|"安全模式命令后下发基站"| KG
KG --> KR1
KG --> KR2
KG --> KU
KG -.-> NH
NH -.->|"切换后新K_gNB"| KG
每一级派生都用密钥推导函数(KDF)完成,输入除了上级密钥,还刻意混入了场景参数——比如服务网络的名称、算法选择、UE标识等。示意如下:
$$ K_{SEAF} = KDF\big(K_{AUSF},\; SUPI,\; \text{服务网络名}\big) $$
为什么参数里一定要掺“网络名”? 这正是EAP-AKA'带来的关键改进:密钥与接入网络密码学绑定。假设某接入网节点的密钥被泄露,攻击者拿着这把密钥去冒充另一个接入点时,因为网络名对不上,派生出来的密钥完全不同,密钥“失效于出国”——泄露的损失被限制在单一网络名称之内。规范化的描述是:密钥与网络名绑定后,“恶意接入点无法冒用从别的网络偷来的密钥”。
为什么要长成一棵树,而不是一把密钥用到底? 核心是密钥隔离:NAS层密钥、RRC层密钥、用户面密钥互为兄弟节点,从密码学上彼此独立——攻破其中任何一把,既推不出它的“父节点”,也推不出它的“兄弟”。这就是密码学里说的密钥语义分离:树越深,单点失守的爆炸半径越小。
| 密钥 | 所在位置 | 保护对象 | 泄露影响范围 |
|---|---|---|---|
| K | USIM / 归属网密钥库 | 一切密钥的根 | 理论上全局(但物理上最难触达) |
| K_AUSF | 归属网 | 认证锚定 | 单用户认证链 |
| K_SEAF | 服务网络核心网侧 | 本网络内派生 | 单次接入 |
| K_AMF | AMF | NAS信令 | 单注册上下文 |
| K_gNB | 基站 | 空口RRC+用户面 | 单基站连接 |
| 各业务密钥 | 基站/UE | 单一功能面 | 单一功能 |
注意树上那根虚线:NH链。每次切换基站,系统会注入新的随机数参与派生,生成全新的 K_gNB。目的是:新旧基站用的密钥在密码学上完全独立——你从A基站走到B基站,B基站拿到的密钥推不出A基站用过的密钥(反之亦然)。走路时通话不断,但锁已经悄悄换了好几把。
5G认证允许两种方法,它们解决的是同一个问题——“如何在不暴露根密钥的前提下完成双向认证并挂好密钥树”,但实现路径不同:
| 维度 | 5G-AKA | EAP-AKA' |
|---|---|---|
| 设计渊源 | 直接沿用AKA挑战应答思想 | 源自IETF的EAP框架(RFC 5448定义) |
| 消息承载 | 核心网服务化接口消息 | 标准EAP消息封装 |
| 网络名绑定 | 服务网络名参与密钥派生 | AT_KDF_INPUT携带网络名,参与CK'/IK'派生 |
| 哈希算法 | 现代派生函数 | 明确从SHA-1升级到SHA-256 |
| 双向确认方式 | 网络比对RES后即完成 | EAP-Success显式确认,双方密钥确认更完整 |
| 密钥输出 | 锚定密钥逐级派生 | 派生MSK/EMSK,再挂入5G密钥树 |
| 典型场景 | 3GPP无线接入默认 | 非3GPP接入(如可信WLAN)及互通 |
两者都要求一个细节级别的防线:认证算法中的 AMF分离位必须置1,手机侧会检查它——这是防止新旧两代密钥派生方式被混用、进而被“降级攻击”利用的开关。看似不起眼的一个比特,是协议作者踩过坑之后的防御补丁。
注册失败排查的第一站。 手机附着失败,信令跟踪里看到认证失败,第一步是区分两种失败:如果是“认证失败(MAC错误)”,方向指向根密钥数据或卡片问题(比如补卡后密钥数据没同步);如果是SQN同步失败(出现AUTS),方向指向归属网序列号管理或换卡、测试卡反复回刷的场景——这两种失败在核心网日志里是一眼可辨的,而能一眼辨出来的前提,就是你脑子里有3.2节那张流程图。
SUCI解密失败。 现网偶发注册卡在认证第一步:手机发了SUCI,归属网解不开。通常是归属网侧的公钥配置文件(算法标识、公钥版本)与手机侧不一致,或者换卡后新卡支持的加密方案更老/更新。排查思路就来自第三节的原理:SUCI信封里明确写着“用了哪个公钥、哪种椭圆曲线”,解不开先核对这串元数据。
安全模式失败不等于认证失败。 认证成功后还有一步“NAS安全模式激活”。如果这一步失败,问题不在“对暗号”,而在两边密钥派生不一致——最常见的工程原因是服务网络名的构造成两边约定不同(多一个字符、大小写、域名校验差异),导致同一棵密钥树在两侧长出了不同的果子,完整性校验自然全挂。这类问题靠抓包比对派生参数才能定位,而“网络名参与派生”这个知识点,就是那把解题钥匙。
三个常见误解,顺手澄清:
Q: 5G-AKA和EAP-AKA',运营商实际怎么选? A: 不是“二选一”,而是按接入类型分场景。3GPP无线接入(5G基站)默认走5G-AKA,链路短、消息少;非3GPP接入(比如可信WLAN融合组网)走EAP-AKA',因为它天然适配EAP框架,且网络名绑定机制对异构接入的安全隔离更强。同一个用户、同一张卡,两种方法可并存。
Q: SUCI和5G-GUTI都是“不暴露真身”的标识,区别在哪? A: 作用阶段和保护机制都不同。SUCI用于注册前——手机还没和网络建立信任时自报家门,靠归属网的公钥加密保护;5G-GUTI用于注册后——双方已经认证并建立安全上下文,网络分配的临时标识,靠已建立的加密信道传输并定期更换。一个是“密封的挂号信”,一个是“进门后的临时工牌”。
Q: 为什么规定CK/IK这类中间密钥绝不允许离开归属网? A: 历史教训:这些密钥一旦下发到访问网络,就多了一份暴露面——漫游合作的境外网络、聚 合点的中转设备都可能被攻破,攻击者拿到CK/IK就能冒充合法接入点。改进后的做法是归属网把中间结果“消化”成锚定密钥再下发,访问网络只接触一级派生品,泄露可锁定、可隔离、不可上溯。
Q: 手机回AUTS(同步失败)是不是坏事? A: 多数情况是正常的自我修复。序列号错位常见于换卡、测试环境反复刷写、归属网数据回滚等场景,AUTS机制就是为此设计的“对表”流程,重新同步后认证即可成功。只有当AUTS高频出现且无法收敛时,才需要查归属网序列号管理是否存在异常。
Q: 切换基站后密钥为什么要刷新?直接复用不行吗? A: 可以复用,但那是安全上的倒退。若切换前后用同一把基站级密钥,攻破任何一个基站的攻击者就能解密你在相邻基站的历史和后续数据。NH链让每次切换注入新鲜随机数重新派生,前后向隔离——密钥的新鲜度和密钥的强度同样重要,这是移动通信安全区别于固定网络的关键认知。
本文由「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 等场景全覆盖。
