住过酒店的人都知道这套流程:你入住时,前台不会把整栋楼的万能钥匙交给你,而是当场给你刷一张房卡。这张卡只能开你自己的房间,退房即失效;保洁员拿的是楼层卡,只能开她负责的那一层;真正能开所有门的母卡,锁在保险柜里,一辈子不出保险柜。
这套设计聪明在哪?丢了房卡,损失半径只有一间房。你不用换整栋楼的锁,前台重刷一张卡就完事。而且房卡本身永远不会“泄露”母卡——就算把房卡拆开研究一辈子,也推算不出母卡长什么样。
5G网络里的密钥体系,就是照着这个思路搭的:一棵树。树根是永不外传的长期秘密,树干和树枝是层层派生出来的子密钥,越往叶子走,钥匙越“具体”、越“廉价”、越“可丢弃”。叶子被偷了,烧掉这片叶子就行,树根毫发无伤。
今天这篇文章,我们就把这棵树从根到叶完整走一遍:它为什么长成这样、每一层钥匙住在哪里、派生是怎么算的、手机移动时这棵树怎么跟着“换枝”。
先想一个反问题:为什么不干脆用一把大密钥,所有网元、所有信令、所有数据都用它加密?
答案藏在三个词里。
动机一:根密钥永不旅行。 用户的长期根密钥K,在整个生命周期里只存在于两个地方——手机里那张防篡改的USIM卡,和归属运营商网络里的认证凭据库(标准里叫ARPF的那个角色)。它从不通过任何接口传输。只要它不出门,再强的窃听者也只能拿到它的“影子”。但如果全网都直接用K加密,那K就必须出现在基站里、AMF里,等于天天把保险柜扛着满街跑。
动机二:限制爆炸半径。 网络里位置越低、数量越多的网元,物理暴露风险越大——一个装在电线杆上的小基站,被人拆走灌恶意软件的可能性,远大于核心网机房里的AMF。所以设计原则是:每个网元只拿到它干活所需的那把钥匙,多一把都不给。基站被攻陷,损失被锁死在空口那一层;核心网信令的钥匙,它连见都没见过。
动机三:单向阶梯。 树上每一把子密钥,都是从父密钥经过单向函数算出来的。单向意味着:拿到子钥,推不出父钥;拿到弟弟,推不出哥哥。这就是密码学里的“密钥分离”(key separation)——同一棵树上的钥匙互相隔离,一把泄露不会顺着树枝爬回去。
三个动机合起来,就是树的形态。这不是标准委员会的审美偏好,而是对“网络必然有薄弱环节”这个现实主义的工程回答:承认会丢钥匙,所以提前设计好丢了以后怎么办。
先上全景图。从根到叶,每一级都标了这把钥匙“住”在哪:
flowchart TD
K["根密钥K<br/>只住在USIM和归属网"] -->|卡内算出| CKIK["CK与IK<br/>鉴权中间产物"]
CKIK -->|归属网内派生| KAUSF["Kausf<br/>留在归属网"]
KAUSF -->|绑定服务网名字| KSEAF["Kseaf<br/>交给拜访网的锚钥"]
KSEAF -->|派生并绑定AMF| KAMF["Kamf<br/>全树的分岔口"]
KAMF -->|非接入层加密| KNASE["Knasenc"]
KAMF -->|非接入层保真| KNASI["Knasint"]
KAMF -->|只发子钥给基站| KGNB["Kgnb<br/>锚在基站"]
KGNB -->|RRC信令完整性| KRRCI["Krrcint"]
KGNB -->|RRC信令加密| KRRC["Krrcenc"]
KGNB -->|用户面加密| KUPE["Kupenc"]
KGNB -->|用户面完整性可选| KUPI["Kupint"]
把每位“家族成员”点名一遍:
| 密钥 | 诞生在哪 | 谁长期持有 | 保护什么 |
|---|---|---|---|
| K | 开卡时写入 | USIM + 归属网凭据库 | 一切之根,永不上路 |
| CK / IK | 卡内鉴权时算出 | 卡内与归属网 | 用来推出上层锚钥 |
| Kausf | 归属网派生 | 归属网AUSF | 锚钥的父本 |
| Kseaf | 归属网确认后交付 | 服务网SEAF | 服务网侧的总闸 |
| Kamf | 由Kseaf派生 | AMF(永不下发) | 树的分岔口 |
| Knasint / Knasenc | AMF派生 | AMF与手机 | 注册、寻呼响应等NAS信令 |
| Kgnb | AMF用NAS计数派生 | gNB | 整个空口分支的根 |
| Krrcint / Krrcenc | gNB派生 | gNB与手机 | RRC信令(完整性强制) |
| Kupenc / Kupint | gNB派生 | gNB与手机 | 用户面数据(完整性可选,5G新增) |
这张表里有几个值得停下来看的细节:
第一,Kamf是全树的分岔口,但它永远不离开AMF。 它分出两支完全独立的分支:一支是NAS分支(手机到核心网的控制信令),留在AMF里;另一支是Kgnb,AMF用“上行NAS计数”当作新鲜度材料,从Kamf里榨出这一把,只把Kgnb发给基站。于是一个关键性质成立了:基站被黑,攻击者拿到的是Kgnb和它下面的叶子,而NAS信令的钥匙它根本没见过——核心网侧的信令对被攻陷的基站是保密的。这就是“密钥分离”最直观的价值:NAS钥匙进不了无线网,空口钥匙进不了核心网。
第二,越靠叶子,钥匙越“一次性”。 根密钥K可能伴随一张卡十年;而叶子层的空口密钥,每次切换小区都会换。高频更换降低了单把钥匙暴露的时间窗口,也让“用了很久的老密钥”这种密码学大忌无从谈起。
第三,Kupint是5G才有的新成员。 4G的用户面数据只有加密、没有完整性保护——攻击者篡改数据包你发现不了。5G给用户面也配了完整性钥匙,虽然是可选功能,但树的位置已经留好了。
树上每一条箭头,都是同一次函数调用。这个函数叫密钥派生函数(KDF),核心就是HMAC-SHA256——一把以“父密钥”为钥匙、以“配方单”为输入的单向哈希:
$$K_{child} = \text{HMAC-SHA256}\big(K_{parent},\ S\big)$$
配方单S的结构很讲究:
$$S = FC \,|\, P_0 \,|\, L_0 \,|\, P_1 \,|\, L_1 \,|\, \cdots$$
FC是一个字节的“用途编号”,标明这次派生是哪一种(派锚钥、派AMF钥、派基站钥,各有一个专属编号);后面跟着若干参数块,每个参数都自带长度标签。整个设计有两个巧思:
巧思一:用途隔离。 哪怕两把父钥相同、参数凑巧一样,只要FC不同,产出的子钥就毫无关系。同一个父钥派出来的“NAS加密钥”和“RRC加密钥”在数学上是两串毫不相干的比特——一种算法被攻破,不会殃及另一种用途。
巧思二:上下文绑定。 派生时掺进去的不只是父钥,还有各种“场合信息”:服务网络的名称、用户永久标识、NAS计数、算法编号、目标小区的物理标识和频点……掺了上下文,钥匙就和“场合”焊死了。比如锚钥绑定了服务网名字,在某张拜访网里拿到的锚钥,拿到另一张网里去用,鉴权直接对不上号——防盗刷。
整个派生过程可以画成一台榨汁机:
flowchart TD
P["父密钥<br/>充当HMAC的钥匙"] --> F["KDF单向榨汁机<br/>HMAC-SHA256"]
FC["用途编号<br/>标明是哪一种派生"] --> F
CTX["新鲜度与绑定材料<br/>计数 小区标识 算法编号"] --> F
F --> OUT["子密钥<br/>推不出父钥和兄弟钥"]
还有两个容易被忽略的精妙细节。其一,算法编号本身是派生输入:手机和基站协商换一个加密算法,叶子钥匙就重新派生一遍——同一把Kgnb配上不同的完整性算法,得到的Krrcint是两把完全不同的钥匙。其二,5G在派生Kamf时掺入了一个叫ABBA的参数,作用是防降级:把“双方实际支持的安全特性集合”焊进钥匙里,中间人想诱骗双方退回更弱的特性组合,派生结果就对不上,攻击当场穿帮。
这棵树是什么时候“发芽”的?在开机注册的鉴权环节。值得强调的是:空口上传输的从来不是任何密钥,而是随机数、挑战值和应答值——真正的密钥是手机和网络两边各自独立计算出来的,算出来的结果必然一致,因为它们共享同一个根和同一张配方。
sequenceDiagram
participant U as 手机与USIM
participant A as 服务网AMF
participant H as 归属网认证中心
H->>A: 鉴权向量与预期应答
A->>U: 发起鉴权挑战
U->>A: 卡内算出的应答
A->>H: 比对通过
H->>A: 交付锚钥Kseaf
A->>A: 逐级派生Kamf与全树
U->>U: 沿同一路径推出同一套
Note over A,H: 锚钥只交给验过答案的服务网
这里有个容易误解的地方:鉴权协议(5G-AKA或EAP-AKA')本身经常被当成“密钥体系”来讲,但它其实只是这棵树的助产师——鉴权证明了“手机和归属网共享同一个根K”,鉴权一旦通过,剩下的活全由KDF这台榨汁机完成。手机侧派生密钥的具体时机也有讲究:要等鉴权结果确认、NAS安全模式命令激活之后,整套安全上下文才算正式上岗。工程上抓信令时会看到“鉴权成功”和“安全激活”是两个步骤,就是这个原因。
树长好了不是终点。手机是要移动的,而移动性对密钥体系提出的考题很刁钻:新基站必须拿到新鲜的钥匙,而且这钥匙不能是旧基站能推算出来的。否则一个被攻陷的源基站,只要守住旧钥匙,就能继续解密用户在新小区的流量——安全防线等于白设。
5G的解法是把基站钥匙的更新做成两条路:
flowchart TD
HO["切换判决<br/>要挪窝了"] --> Q{"目标基站怎么够到"}
Q -->|同AMF辖区直接走Xn| HR["横向派生<br/>旧站钥匙推出新站钥匙"]
Q -->|跨AMF经核心网走N2| VE["垂直派生<br/>取用AMF预存的全新NH"]
HR --> BX["掺入目标小区标识与频点"]
VE --> BX
BX --> NCC["NCC计数随切换令牌下发<br/>手机照方抓药推出同款"]
横向派生:源基站用自己手里的Kgnb直接推出目标站的钥匙。快,但源基站自己知道推法——这一跳谈不上前向安全。适合邻居站之间毫秒级的快速切换。
垂直派生:AMF事先从Kamf往下铺好一条NH链——一串首尾相接的全新密钥材料,每一环都由上一环单向推出,源基站手里没有这条链。切换时从链上取一个没用过的环,掺入目标小区的物理标识和频点,算出目标站的新钥匙。源基站就算被黑透了,也反推不出这条链上的任何一环。前向安全由这一步保证。
区分两条路的机关是随切换信令下发的NCC计数器:手机收到切换命令时看一眼NCC——和本地存的一样,说明走的是横向;比本地的大,说明走了垂直,手机就把NH链往前推几格,推出同样的钥匙。双方无需传任何密钥,一个计数器就完成了“我们对答案”的暗语。
还有一个漂亮的推论:NH链每切一次站往前走一格,所以一个被攻陷的基站,最多两跳之后就彻底出局——它手里的材料再也够不着链条上更远的环。这就是标准用NCC和NH搭出来的“两跳前向安全”承诺。
顺手补充实战里会撞见的一个点:密钥派生输入里掺了PDCP计数,而计数是会绕回的。连接态下如果计数即将用尽,网络不需要真切换,就地做一次“小区内切换”,重派一把Kgnb,计数从新钥匙重新起步。你在现网日志里看到“同站切换”却不带任何移动原因,多半就是这出戏。
| 维度 | 4G的树 | 5G的树 |
|---|---|---|
| 层级深度 | 锚钥Kasme直接落在MME,两级就到基站 | Kausf、Kseaf、Kamf多级锚定,逐级绑定 |
| 锚钥绑定对象 | 绑具体MME | 绑服务网名字,跨AMF可携 |
| 用户面完整性 | 没有 | 可选开启Kupint |
| 身份保护 | IMSI可能明文上空口 | 永久标识加密成SUCI再出门 |
| 密钥长度 | 128位 | 128位在用,层级预留256位空间 |
| 归属网参与度 | 鉴权后基本退场 | 锚钥始终握在归属网手里 |
逐条翻译成“为什么”:4G锚钥绑死MME,意味着换MME常常要重新鉴权,漫游场景下拜访网拿到的材料也偏“重”;5G把锚点拆成多级、锚钥绑服务网名字,既让锚钥可以在同一服务网内的AMF之间平滑搬迁,又让拜访网永远只拿到“这个网、这次会话”专用的材料。用户面完整性是4G缺失的一环,5G补上了。密钥长度方面,树干已经按256位在盖,算法可以以后换代,树不用重种。
调试场景一:注册被拒,鉴权反复失败。 实验室用测试卡时,如果USIM里预置的根密钥与核心网侧配置不一致(K或算子密钥对不上),鉴权应答永远算不对,计数器失步还要走重同步流程,失败次数一超限就上永久拒绝名单。记住排查次序:先核对卡密钥配置,再看鉴权向量的序号同步,最后才怀疑算法。
调试场景二:NAS安全模式命令发出后石沉大海。 NAS安全激活是整套上下文的“开闸”动作,手机校验完整性失败会直接不响应。常见原因是算法协商清单与卡的能力不匹配,或者互操作场景中映射上下文的标识(ngKSI)没对齐——这个小小的密钥集标识就是双方指认“我们共用的那套上下文”的暗语,暗语对不上,手机只好重新鉴权。
调试场景三:切换之后上行突然失步。 切换后密钥必然换新,若目标站的安全上下文没就位、NCC没对上,手机和基站就会各算各的钥匙,完整性校验全挂。抓信令看切换命令里携带的NCC值与两侧派生路径,是定位这类问题的标准动作。
调试心态一:抓包“看不到内容”是正常的。 安全激活之后,NAS和RRC消息的净荷都是密文,抓包工具只能看到消息类型和长度。很多人第一反应是“我抓包姿势不对”——不,那恰恰说明安全在工作。你想看明文,得靠设备侧的解密接口或测试工具在密钥落地处还原。
调试心态二:别把“5G更安全”理解成“5G全程加密”。 用户面加密算法可协商,低速率物联网场景甚至可能配到空算法;用户面完整性更是可选项。信令的完整性才是铁律——正常业务里RRC和NAS绝不允许空完整性,真在日志里看到空完整性的信令承载,那是安全故障,不是合法配置。
最常见的误解:以为基站里存着“用户的密钥”。 实际上基站从AMF拿到的只是Kgnb这把“分店钥匙”,用户的根、锚钥、NAS钥匙它一概不知。这也是为什么标准敢把基站大规模地撒到灯杆和楼顶上——密钥的层级结构,就是信任的层级结构。
Q: 这棵密钥树和手机APP里的HTTPS加密是什么关系?谁保护谁? A: 两层互不替代。密钥树保护的是“管道”:手机到核心网之间的空口与信令,由运营商部署,任何APP的流量都受益。HTTPS保护的是“端到端”:你的数据从APP服务器到手机全程加密,运营商自己也看不到明文。管道加密防的是链路窃听与信令伪造,端到端加密连运营商一起防。你刷HTTPS网页时,数据其实穿了三层甲:外层空口加密、内层TLS、应用层自有加密。
Q: 用户面加密是可选的,那我不就一直裸奔? A: 不必焦虑。可协商不等于默认关闭——主流网络对手机宽带业务普遍开启空口加密。真正要想清楚的是场景:海量物联网小包设备可能为了省电选弱配置,这类设备本就该按“链路不可信”来设计应用层安全。原则是:空口加密是运营商给的底线防护,关键数据的应用层加密永远自己带。
Q: 运营商能拿到我的根密钥吗?能解密我的一切吗? A: 根密钥写卡时固化在USIM里,网络侧只有凭据库里对应的副本,且只用于卡内鉴权计算,从不在接口上传输。运营商能推进管道、能按流程派生会话密钥,因此在技术上具备解密空口流量的能力——这正是TLS这类端到端加密存在的意义。但“有能力”和“随便用”之间隔着法律与审计,多数国家的运营商无权随意解密用户内容。
Q: 切换换钥匙,视频通话会不会卡一下? A: 不会。横向派生就是源基站的一次本地计算,垂直派生也只是多取一个预置的链环,整个换钥过程与切换信令同步完成,毫秒级、无感。密钥刷新和数据转发的路径接力是并行的两套机制,互不拖累。
Q: 量子计算机来了,这棵树会倒吗? A: 短期不会。树的全套派生都建立在HMAC-SHA256和对称算法上,256位对称密钥对量子攻击的抵抗力远好于公钥体系(量子加速对对称密钥大致是对折,256位折半仍有128位强度)。真正先受冲击的是SUCI身份加密用的椭圆曲线部分,这也是标准化组织已在推进抗量子算法迁移的原因——树的结构不用动,换几片叶子而已。
本文由「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 等场景全覆盖。
