想象你在酒店办入住,前台不是让你把身份证递进窗口,而是让你站在大堂里,把自己的身份证号大声念出来——旁边的所有人都能记下来。听起来荒唐,但这就是过去三十多年手机接入移动网络的方式。
手机里有一张SIM卡,卡里写着一个全球唯一的号码。2G、3G时代它叫IMSI,5G换了个名字叫SUPI,本质没变:前3位是国家码MCC,接着2~3位是运营商网号MNC,剩下9~10位是用户号MSIN。整个运营商的用户数据库,就靠这串数字来认人。
问题出在「认人」这个动作发生的时机。手机每次开机、跨省漫游、长时间失联后回来,都要向网络报到。网络这时会问一句:你是谁? 在2G/3G/4G里,如果手机手里没有有效的临时号码(TMSI/GUTI),它就会把这串终身不变的真名原封不动、不加加密地发到空口上。而空口,是物理世界中任何人都能架设备收听的广播信道。
于是有了「IMSI捕手」(IMSI catcher),俗称伪基站。它的攻击原理并不高深,甚至可以说抓住了人性中最朴素的规则——手机永远挑信号最强的基站:
flowchart TD
F1["伪基站开机<br/>功率压过真站"] --> F2["手机挑最强信号<br/>主动凑上来"]
F2 --> F3["伪基站发身份请求<br/>要求报上真名"]
F3 --> F4["手机明文上报IMSI<br/>身份暴露"]
F4 --> F5["还能强制关闭加密<br/>进一步窃听"]
它得逞依赖三道旧时代的「设计缺口」:
这三道缺口的核心,是真名暴露:只要攻击者能让手机说出IMSI,位置追踪、用户关联就全部成立。这个问题贯穿2G、3G、4G整整三十年,行业标准组织不是不知道,而是始终下不了决心——因为改掉它意味着放弃向下兼容。
要理解5G为什么这样设计,得先想清楚一个更基本的问题:网络为什么非要知道你的真名不可?
因为移动网络的认证是基于对称密钥的:SIM卡和网络数据库里各自存着同一把根密钥K,认证时双方各自算一遍,结果对得上就放行。对称密钥的特点是不区分对象——一把钥匙配一把锁,你得先知道「这个人是谁」,才能去数据库里查出和他配对的那把钥匙。
所以流程必然是:先认人(身份标识),再认证(密钥校验)。真名是查钥匙的索引,躲不掉。
那临时标识呢?网络早就发明了「化名」机制:注册成功后,网络发给你一个 periodically 更换的临时号(3G之前叫TMSI,4G/5G叫GUTI),之后空口只说化名。但化名有两个天然失效场景:
化名能省事,但兜底机制必须存在,而兜底机制恰恰就是报真名。攻击者打的就是这个兜底。
5G做了一个三十年前就该做的决定:兜底时也不许报真名。如果网络认不出你的临时号,手机上报的不再是明文SUPI,而是一只密封信封——SUCI(Subscription Concealed Identifier,用户隐藏标识)。
它的核心思想一句话就能说清:
手机把真名(准确说只是MSIN那10位数字)用一个只有归属运营商才持有的公钥加密后发出。路上经过的所有人——基站、拜访网络的各个网元——都只能看到信封,没人能拆。信封寄回老家,由老家网络里一个专门的解密功能(SIDF)用私钥拆开,还原真名。
用寄快递来类比:包裹面单上写着收件城市、投递网点编号(这些必须明文,否则快递员不知道往哪送),但箱子上了锁,钥匙只有你家里人有。快递链条上任何人都能搬动它、路由它,却拆不开它。
这里面藏着一个精妙的信任设计:为什么解密权放在归属网络,而不是拜访网络?
想想国际漫游的场景。你出国漫游,为你服务的是当地运营商的网络。按旧设计,你的真名要交给拜访网络,等于把身份底细托付给一个你跟它没有任何契约关系的外国公司。新设计里,拜访网络从头到尾只见信封,真名只回到和你有签约关系的归属运营商手里。隐私不再依赖路上每个人的职业道德,而是由数学保证——这是从「制度信任」到「计算信任」的跃迁。
SUCI不是一整块密文,而是一张结构化的面单:
flowchart TD
A["SUCI:一只密封信封"] --> B["SUPI类型<br/>0为IMSI 1为NAI"]
A --> C["归属网络标识<br/>MCC加MNC"]
A --> D["路由指示器<br/>1到4位数字"]
A --> E["保护方案标识<br/>声明封口方式"]
A --> F["归属公钥标识<br/>0到255"]
A --> G["方案输出<br/>真正的密文部分"]
G --> G1["临时公钥<br/>约32字节"]
G --> G2["密文<br/>只有MSIN被加密"]
G --> G3["MAC校验码<br/>8字节"]
| 字段 | 取值/长度 | 明文还是密文 | 为什么这样设计 |
|---|---|---|---|
| SUPI类型 | 0~7,0=IMSI,1=NAI | 明文 | 告诉网络信封里装的是哪种身份 |
| 归属网络标识 | MCC+MNC或域名 | 明文 | 相当于「邮编」,不写清楚信寄不回老家 |
| 路由指示器 | 1~4位数字 | 明文 | 大运营商用户库分片存放,靠它选对数据库 |
| 保护方案标识 | 0~15 | 明文 | 声明用了哪种封口算法 |
| 归属公钥标识 | 0~255 | 明文 | 老家可能有多把钥匙,告诉它用哪把拆 |
| 方案输出 | 变长字节串 | 密文 | 临时公钥+加密的MSIN+完整性校验码 |
注意一个反直觉的细节:MCC、MNC是明文的。很多人第一反应是「这不还是泄露了吗」。但换个角度看——MCC/MNC只暴露「你用的是哪个国家的哪家运营商」,这个信息你的手机只要搜网就必然广播出去(小区选择本来就要读网络号),藏无可藏。真正值钱的是MSIN,它是把「某运营商的某个用户」精确到「你这个人」的最后一位差值。5G的设计是把藏得住的藏死,藏不住的放行用于路由——在隐私和可用性之间切了一刀,切在信息价值最大的地方。
保护方案目前定义了三档:
| 标识 | 名称 | 使用的曲线 | 说明 |
|---|---|---|---|
| 0 | null scheme | 无 | 完全不加密,MSIN裸奔 |
| 1 | Profile A | Curve25519 | 新一代曲线,公钥32字节,运算快 |
| 2 | Profile B | P-256(secp256r1) | 经典曲线,兼容存量加密硬件 |
null scheme 的存在是一处历史妥协:如果发卡时没有把归属公钥写进SIM卡,手机只能用0号方案——等于递了个没封口的信封。这是现网排查隐私问题时最该盯的一个字段,后面实战部分细说。
SUCI的封口用的是椭圆曲线集成加密方案(ECIES),整个流程可以拆成四步,每一步都有明确的「为什么」。
第一步:手机现场造一对一次性钥匙。 每次需要上报身份时,手机随机生成一对全新的椭圆曲线密钥对:私钥 $d_U$、公钥 $Q_U$。注意这不是SIM里的长期密钥,而是用完即弃的临时钥匙。
第二步:和老家做一次盲联合。 手机手里有归属网络的公钥 $Q_H$(发卡时写进USIM),于是计算椭圆曲线上的点乘:
$$S = d_U \times Q_H = d_H \times Q_U$$
这个等式两边从不同出发点算出了同一个值:手机用「自己的临时私钥×老家的公钥」,老家(理论上)用「自己的私钥×手机的临时公钥」也能得到同一个 $S$。而窃听者两个私钥都拿不到,想从公钥反推私钥,面对的是椭圆曲线离散对数难题——正着算是乘法,反着算是天文数字级的穷举。这就是ECDH密钥协商:双方从未传输过共享秘密,却各自算出了同一个秘密。
第三步:派生出两把工作钥匙。 共享秘密 $S$ 不能直接当加密密钥用,要经过密钥派生函数(基于HMAC-SHA-256,输入还包括临时公钥等上下文)拉伸出两把:
$$K_{enc} \,|\, K_{mac} = \mathrm{KDF}(S,\ Q_U)$$
一把管加密,一把管校验,各司其职。
第四步:加密+盖章。 MSIN(约10位数字,压缩成5个字节)用 $K_{enc}$ 做AES-256-GCM加密,同时用 $K_{mac}$ 生成8字节的消息校验码贴在信封上——老家拆信前先验章,防止有人在路上篡改信封内容(比如偷偷替换成另一个用户的MSIN,做身份调包)。
整个方案最点睛的是第一步的「一次性」。因为临时密钥对每次都是现造的,同一个手机昨天和今天上报的SUCI长得完全不一样——窃听者就算录下你所有的信封,也无法判断哪两个来自同一个人。被动监听下的用户追踪链条,从数学上被剪断了。
把信封放进完整流程里看。以5G独立组网的开机初始注册为例:
sequenceDiagram
participant U as 手机
participant B as 基站
participant A as AMF
participant D as UDM及SIDF
U->>B: 初始注册请求 携带SUCI
B->>A: 透传注册请求
A->>D: 按归属标识和路由指示器选路 请求鉴权数据
D->>D: SIDF用私钥拆信封 还原SUPI
D->>A: 返回SUPI和鉴权向量
A->>U: 鉴权通过后分配5G-GUTI
Note over A,D: 真名只在归属网络内还原
三个关键转折:
flowchart TD
subgraph 手机侧
SIM["USIM<br/>写入归属公钥"]
UE["手机<br/>现造临时密钥对"]
end
subgraph 拜访方
SN["服务网络AMF<br/>全程只见信封"]
end
subgraph 归属方
PK["私钥<br/>永不外发"]
SIDF["SIDF<br/>唯一拆信人"]
end
SIM --> UE
UE -->|每次注册递新信封| SN
SN -->|按明文面单转交| SIDF
PK --> SIDF
这个模型里有两个容易被忽略的细节:
| 代际 | 长期身份 | 空口明文风险 | 网络向手机认证 | 长期身份加密 |
|---|---|---|---|---|
| 2G | IMSI | 位置更新等场景可直接被抓取 | 否 | 无 |
| 3G | IMSI | 仍存在明文上报场景 | 是 | 无 |
| 4G | IMSI | 无有效GUTI附着时明文发送 | 是 | 无 |
| 5G SA | SUPI | 协议禁止明文上报真名 | 是 | 有(SUCI) |
这张表里藏着通信安全演进的一条主线:2G解决「别人能不能偷听」,3G解决「网络是不是真的」,而5G才开始解决「你有没有必要暴露自己」。隐私保护比加密晚了二十多年,因为它需要非对称密码进入终端——而这一步直到椭圆曲线运算在SIM卡和手机上变得足够廉价才真正可行。
对一线工程师,这套机制落在几个具体的排查点上:
suci-0-460-07-0000-1-1-一长串十六进制 的字符串,字段顺序就是上面的面单:类型-归属标识-路由指示器-保护方案-公钥标识-密文。能直接读出「0-460-07」意味着这是一张中国某移动网络的IMSI型卡。0(null scheme),说明这张卡发卡时没有写入归属公钥,MSIN实际是明文。大量注册失败或隐私审计问题,根因都在发卡环节漏配公钥,而不是核心网配置。最后是两个必须澄清的边界:
Q: SUCI和5G-GUTI到底是什么关系? A: 信封和工牌的关系。SUCI是「需要临时自证身份」时用的信封,拆开要寄回老家;5G-GUTI是注册成功后网络当场发的工牌,本地刷脸通行,走失了就再寄一次信封补办。日常信令九成以上用的是工牌。
Q: 同一部手机每次上报的SUCI都一样吗? A: 不一样。ECIES的临时密钥对是每次现造的,密文部分随之完全改变。这正是设计意图——让窃听者无法通过「同一个SUCI反复出现」来追踪同一个用户。
Q: null scheme 既然不加密,为什么还留着? A: 兼容存量。写有归属公钥的卡需要运营商重新发卡或写卡,协议只能规定「可以用null」,把升级节奏交给运营商。对用户而言,识别方式就是抓包看保护方案字段是否为0。
Q: 有了SUCI,2G伪基站的威胁就结束了吗? A: 没有。多模手机在信号被干扰时可能降级到旧网络,旧网络的明文身份机制依然存在。SUCI封住的是5G SA内的洞,「逼你回到旧世界」的降级攻击链路要靠网络侧的降级防护策略和终端的告警能力共同收敛。
Q: 路由指示器听起来像内部参数,用户会感知到它吗? A: 平时无感,但它是发卡数据的一部分。换卡、携号转网、引入新的用户数据库分片时,这个4位小数字配错一个,整批卡的注册就会失败——它是发卡检查单上必查项。
本文由「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 等场景全覆盖。
