十七世纪的欧洲,一封信从伦敦寄到巴黎要走上一个星期,途中经过无数驿手。写信人不怕信被偷看——重要的内容可以用密语写,甚至整封信都用只有收信人认识的符号。但有一件事密语防不住:有人把信拆开,改掉内容,再原样封回去。把「货到付款」改成「货到付清」,把「三日之内」改成「三十日之内」,密语照样通顺。
于是有了火漆印:信封封口处滴上融化的蜡,盖上发信人的私章。蜡一干就定型,拆信必然破坏火漆。收信人不用读内容,先看火漆——火漆完好,信就没被动过;火漆碎了,后面写得再通顺也是废纸。
移动网络的空口信令,就活在那个「驿手不可信」的世界里。电波在空气中传播,任何一个懂协议的人都可以架一台接收机听,还可以架一台发射机说。工程师们为空口准备了三道防线:加密防偷看,认证防冒充,而防篡改的这道防线,用的是「火漆印」的思路——它的学名叫完整性保护(Integrity Protection)。
这是三道防线里最少被谈论、却最容易被误解的一道。很多人以为「加密了就安全了」,本文要说的第一件事就是:加密和完整性保护是两回事,缺了后者,前者形同虚设。
先建立一个坐标系。空口上的攻击者能做三件事,对应三个安全目标:
| 安全目标 | 防什么攻击 | 用什么手段 | 现实类比 |
|---|---|---|---|
| 机密性(Confidentiality) | 偷看:窃听空口内容 | 加密算法 | 密语写信 |
| 真实性(Authentication) | 冒充:假基站骗手机、假手机骗网络 | 双向认证 | 验明正身 |
| 完整性(Integrity) | 篡改:偷改信令内容而不被发现 | 消息认证码(MAC) | 火漆印 |
flowchart TD
T["空口攻击者"] --> A["偷看信令"]
T --> B["冒充基站"]
T --> C["篡改信令"]
A --> A1["机密性防线:加密"]
B --> B1["真实性防线:双向认证"]
C --> C1["完整性防线:消息认证码"]
A1 --> R1["结果:看不懂"]
B1 --> R2["结果:进不来"]
C1 --> R3["结果:改了必被抓"]
三者缺一不可,但防篡改这条线有个特殊之处:它防的攻击者最「文明」。他不偷看、不冒充,只是把你的消息在半路改掉几个字节——而且改完的消息在协议上完全合法。这种攻击最难察觉,也最致命。
直觉上,数据都加密了,攻击者没有密钥,怎么改?改了也解不出有意义的明文吧?恰恰相反。以空口最常用的流密码为例,加解密就是一次异或:
$$C = M \oplus KS$$
其中 $M$ 是明文,$KS$ 是密钥流,$C$ 是密文。解密时再做一次异或:
$$M = C \oplus KS$$
现在攻击者在半路把密文的某一位从 0 翻成 1,记篡改后的密文为 $C' = C \oplus \Delta$,接收方解密得到:
$$M' = C' \oplus KS = M \oplus \Delta$$
密文翻一位,明文就精确地翻同一位,其余部分原样恢复。解密过程「成功」,协议栈完全不知道发生过篡改。密码学里管这个性质叫可锻造性(malleability)——密文像面团,不需要密钥也能捏出想要的形状。
攻击者虽然不知道密钥流,无法把任意明文变成任意密文,但他不需要。信令里关键字段的字节位置是协议公开规定的:切换目标小区的编号在第几个字节、QoS 参数在第几个比特,全是公开知识。攻击者只需在正确的位置翻正确的位,就能把「切换到小区 A」改成「切换到小区 B」,把「接受」改成「拒绝」。
类比一下:加密是把文件锁进保险箱,防的是打开箱子看;但攻击者可以根本不开箱,直接整箱调包。保险箱锁得再结实,也防不住调包——防调包需要的是封条,是「箱子被动过就一定看得出来」的机制。完整性保护就是那张封条。
完整性保护的核心工具叫消息认证码(Message Authentication Code,MAC)。原理一句话:用只有通信双方持有的密钥,为每条消息算出一个「指纹」,附在消息尾部。
$$Tag = F(K_{int}, M)$$
$F$ 是公开的密码学函数(不需要保密),$K_{int}$ 是完整性密钥(必须保密),$M$ 是消息本体。发送方算出 $Tag$ 附在消息后发出;接收方收到后,用同一把密钥对消息重算一遍指纹,和收到的比对:
flowchart TD
A["发送方:消息M"] --> B["用密钥K算出指纹"]
B --> C["M尾部附上MAC-I发出"]
C --> D["半路攻击者篡改M"]
D --> E["接收方收到消息与指纹"]
E --> F["用同一密钥K重算指纹"]
F --> G{"两者一致?"}
G -->|一致| H["收下消息"]
G -->|不一致| I["丢弃并触发异常"]
这套机制为什么有效?关键在两点:
第一,指纹依赖密钥。 攻击者改了消息,也知道自己算不出正确的指纹——因为 $F$ 虽公开,但没有 $K_{int}$ 就算不出结果。他能做的只有瞎猜一个值附上去。
第二,指纹对消息的每一位敏感。 好的 MAC 函数里,消息改动哪怕一个比特,算出的指纹都会面目全非(雪崩效应)。所以改了消息不换指纹、或者换了指纹但算错,接收方一算便知。
于是通信双方达成一种不对称的优势:合法双方算指纹轻而易举,第三方想伪造一个能通过校验的指纹,只能靠猜。这正是火漆印的逻辑——盖印容易,伪造私章难。
工程师最常见的误解在这里。有人会问:协议里不是到处都有校验码吗?PDSCH 有 CRC,TCP 有校验和,篡改数据不是早就该被发现了吗?
CRC 和 MAC 是两种完全不同的东西,区别只有一个字:密钥。
| 对比项 | CRC(循环冗余校验) | MAC(消息认证码) |
|---|---|---|
| 算法是否公开 | 公开 | 公开 |
| 是否需要密钥 | 不需要 | 需要,只有通信双方持有 |
| 设计目标 | 检出自然差错(噪声、衰落、干扰) | 检出恶意篡改 |
| 攻击者能否伪造 | 能,改完数据顺手重算即可 | 不能,算不出正确值只能猜 |
| 数学本质 | 线性码, anyone 可验可算 | 带密钥的单向函数 |
CRC 的输入输出对任何人都一样:你把篡改后的数据重新算一遍 CRC,填进校验字段,接收方一验——完美通过。CRC 的一生之敌是宇宙射线和热噪声,不是人。而 MAC 的设计前提就是有一个持密钥的对手在跟你博弈:他什么都知道,只缺那把密钥。
所以在移动网络里两者并存、各司其职:物理层 CRC 负责对付无线信道的自然差错,让接收端把解错的数据丢掉重传;上层 MAC 负责对付「有人故意改包」——这是两个世界的敌人,一张网里都躲不开。
一个完整的 MAC 输出通常是 128 位,但空口信令里附带的指纹(协议里叫 MAC-I)只有 32 位。为什么不带全?
算一笔账。假设完整的 128 位指纹全带上,每个包多 16 字节,对海量的小信令包是可观的空口开销。而 32 位意味着攻击者伪造一次的猜中概率是 $2^{-32}$,约 40 亿分之一。看起来比 $2^{-128}$ 弱得多,但两个因素把差距拉平了:
第一,猜错一次就是一场灾难。 在真实的加密通信里,MAC 校验失败不是「这包算了」,而是触发同步失败、安全上下文作废、链路重建立。攻击者没有无限次试错机会,每猜错一次都会惊动网络。
第二,单条消息的攻击价值本来就低。 完整性保护要守的是「这一条信令不被改」,一次攻击得手 $2^{-32}$ 的概率,配合失败即断链的惩罚,实际攻击成本极高。
这是安全设计里典型的截短经济学:在开销和强度之间取一个工程平衡点。类似的思路无处不在——数字证书的有效期不是越长越安全,太长的有效期等于给泄露的私钥续命。
完整性保护不是全网无差别覆盖,4G 和 5G 都做了精细的取舍。看落点地图:
| 层面 | 4G LTE | 5G NR | 为什么 |
|---|---|---|---|
| NAS 信令(手机↔核心网) | 完整性保护,强制 | 完整性保护,强制 | 管理信令一条顶一万条 |
| RRC 信令(手机↔基站) | 完整性保护,强制 | 完整性保护,必选;加密反而可选 | 见下文 |
| 用户面数据 | 无完整性保护,只加密 | 新增可选的完整性保护(核心网侧执行) | 物联网防篡改需求 |
三个观察点:
为什么信令必保护、数据(在4G)不保护? 因为信令是「指挥权」。一条被篡改的切换命令能把手机骗到错误的频率上;一条被篡改的安全模式命令能让整套加密形同虚设。信令量小、价值极高,每条盖火漆都划算。用户面数据量大,逐包算 MAC 的处理开销在当年不可接受,而且数据传输有 TCP 校验和、应用层校验兜底,错一个包的损失是局部的。信令丢了会瘫痪,数据错了会损失——先保指挥权。
为什么 5G 把用户面完整性保护补上了? 海量物联网时代,很多终端发的数据本身就是「轻信令」——传感器读数、抄表数据,一条数据就是一条指令级的信息,篡改水电表读数就能造成真实的计费损失。这些流量走用户面,没有信令层保护可依托,于是 5G 把完整性保护下沉到了用户面,由核心网侧执行。这也是 5G 安全体系对物联网时代的一个正面回应。
为什么 5G 的 RRC 加密反而变成可选? 看似倒退,实则是分层逻辑:完整性保护在任何情况下都强制,因为「被改」比「被看」危害更大;而「被看」这一层,有些场景(如某些低能力终端、特殊覆盖场景)有取舍空间,标准允许配置。一句话:火漆永远要盖,密语可以商量。
完整性保护依赖密钥,密钥来自认证之后双方协商出的根密钥的派生。于是一个经典死锁出现了:在完成认证之前,双方没有共享密钥;而没被保护的信令,又怎么敢用来送认证参数?
解开死锁的顺序设计得非常精巧,分两步走:
sequenceDiagram
participant UE as 手机
participant gNB as 基站
participant AMF as 核心网
AMF->>gNB: 下发初始安全模式命令
gNB->>UE: RRC安全模式命令(带首个MAC-I)
UE->>UE: 校验指纹,激活完整性保护
UE->>gNB: 安全模式完成(首个上行受保护信令)
gNB->>AMF: NAS安全模式完成
Note over UE,gNB: 此后每条信令都盖火漆
第一步,认证过程产生双方共享的根密钥——这一段的信任基础不在空口,而在卡里那把从出厂就与运营商对应的核心密钥,认证机制保证根密钥只出现在两端,空口上永远只飞过随机数和无法反推密钥的认证令牌。
第二步,核心网通过基站下发安全模式命令(Security Mode Command)。这条消息就是空口上第一封盖了火漆的信——它本身携带用派生密钥算出的 MAC-I。手机验签通过,才真正激活完整性保护;从这之后,上下行的每一条 RRC 和 NAS 信令都带指纹。
而在安全激活之前的几条裸信令(如最初的连接建立请求),确实处于无保护窗口。这个窗口的存在是工程上的必要妥协,窗口里能说的话被压到最少——只有建链所需的最基本参数,值得篡改的信息内容趋近于零。把裸奔窗口压到最窄、窗口里的信息压到最少,是一切安全协议设计的共同手筋。
指纹用什么函数算?移动网络备了三把「印章」,网络和手机各自上报能力,挑一把双方都会用的:
| 算法 | 核心构造 | 出身 | 特点 |
|---|---|---|---|
| IA1 | SNOW 3G 流密码 | 欧洲团队设计 | 老资格,硬件实现成熟 |
| IA2 | AES-CMAC | 基于 AES 的 MAC 模式 | 复用最普及的密码学原语 |
| IA3 | ZUC(祖冲之) | 中国自主设计 | 软硬件实现皆高效 |
三个算法安全性上都被认为是可靠的,共存的意义在于多样性:万一某天某个算法被发现弱点,网络可以整体切换到备选算法,不至于全网裸奔。这种「密码敏捷性」的思想——算法必须可替换,依赖必须可迁移——比任何一个具体算法都更值得记住。5G 还把密钥长度扩展到 256 位档位,为未来几十年的算力增长预留余量。
有意思的是算法命名背后的地缘:SNOW 3G 与 AES 是欧洲与美国密码学传统的产物,ZUC 则由中国团队设计并以古代数学家祖冲之命名。算法的全球化共存,本身就是国际标准博弈与合作的一个缩影。
排查注册失败时,安全模式环节是高发故障点。手机发出安全模式完成后收不到后续、或直接收到拒绝,往往指向完整性保护失败——典型根因是两端密钥不一致:测试 USIM 的密钥参数在卡和核心网侧配置不匹配,是最经典的翻车现场。理解了「指纹靠密钥」这个原理,就能立刻锁定排查方向:校验失败 = 密钥对不上或密钥派生参数不一致,而不是去查无线信号。
看协议信令时,抓包工具里 RRC 消息上那个 MAC-I 字段就是本文的主角。安全激活之前抓到的初始信令没有这个字段,激活之后的每条信令都有——抓包里这个字段「从无到有」的分界线,就是安全模式命令那一步。反过来,如果安全激活后仍有信令缺失该字段,要么是测试环境关了保护,要么就是异常。
理解假基站的边界时,完整性保护是分水岭。双向认证让假基站进不了核心网,完整性保护让它改不了真信令——假基站已无法把「拒绝」改成「接受」、无法伪造切换命令劫持手机。剩下的攻击路径只剩「逼你降级」:发出强信号诱使手机回落到保护薄弱的老制式。理解了这一点就明白,移动通信安全的演进史,就是一部不断缩小裸奔窗口的历史——每一代制式都在把上一代的裸奔窗口焊死。
一个调试陷阱:实验室用仪表或开源模拟器测试时,常有人为了图省事在终端侧关掉完整性保护做调试。带着这种配置去对接现网,注册必然失败,而且失败的表象(安全模式无响应)会把人引向完全错误的排查方向。先确认安全配置,再查无线原因,是接入类问题的正确排查顺序。
移动网络的空口安全,回答的是三个不同的问题:你是谁(认证),别人听不听得懂你(加密),你有没有被动过(完整性)。前两个问题名声在外,第三个问题最安静,却维系着前两个的成果——加密得再好的信道,如果消息可以被无声篡改,攻击者就能借你的密语传他的话。
火漆印的智慧穿越四百年没有变味:保密靠锁,可信靠印。锁可以有无数把,私章只有一枚。 每一条空口信令尾部那 32 位的 MAC-I,就是这枚私章在数字世界的落款。
Q: 加密和完整性保护有什么区别?只做加密不行吗? A: 不行。加密保证「看不懂」,完整性保护保证「改不了」。流密码下密文翻一位、明文就翻同一位,攻击者不需要密钥就能定向篡改,接收方毫无察觉。两者是独立的安全目标,必须各自实现。
Q: CRC 校验不就是防篡改的吗?为什么还要 MAC? A: CRC 没有密钥,任何人都能重算。攻击者改完数据后把 CRC 字段一起改掉即可通过校验。CRC 防的是自然差错(噪声、衰落),MAC 凭借只有通信双方持有的密钥才能防恶意篡改。
Q: MAC-I 只有 32 位,攻击者多试几次不就撞上了? A: 一次校验失败就不是「丢一个包」而是触发安全异常和链路重建,攻击者没有无限试错的机会。失败即暴露的惩罚机制,让 40 亿分之一的单次猜中率在工程上足够安全。
Q: 为什么 4G 用户面数据不做完整性保护,5G 又加回来了? A: 4G 时代逐包算 MAC 的开销对海量数据不可接受,且数据错包有 TCP 和应用层兜底,损失是局部的;信令必须优先保护。5G 面向物联网,传感器读数本身就是高价值信息,篡改有真实危害,因此在核心网侧补充了用户面完整性保护选项。
Q: 安全激活之前那几条信令没有保护,是不是风险很大? A: 是必要妥协,但风险被压到极小。裸奔窗口被设计得尽量短,窗口内的信令只包含建链所需的最基本参数,没有任何值得篡改的内容。真正的敏感操作都排在完整性保护激活之后。
本文由「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 等场景全覆盖。
