5G认证与密钥协商:5G AKA协议流程、EAP-AKA'扩展、SUCI与隐私保护、密钥层次结构与派生

各位同学,今天我们来啃一块硬骨头——5G的认证与密钥协商。说实话,这部分内容在3G/4G时代就已经很复杂了,到了5G,因为引入了SBA架构和更强的隐私保护需求,整个流程又上了一个台阶。我在做5G核心网安全测试的时候,经常发现很多工程师对AKA流程的理解停留在「发几个消息就完事了」的层面,结果一遇到实际的信令交互问题就抓瞎。嗯,今天我们就把它彻底讲透。

5G AKA协议流程:从SEAF到AUSF再到UDM的三角博弈

5G AKA,全称是5G Authentication and Key Agreement。说白了,就是手机(UE)和网络之间互相确认身份,然后协商出一套加密密钥的过程。你想想看,如果这一步出了问题,后面所有的通信都是裸奔。

整个流程涉及三个核心网元:SEAF(安全锚点功能)、AUSF(认证服务器功能)和UDM(统一数据管理)。我习惯把SEAF看作是「守门员」,AUSF是「裁判」,UDM是「球员数据库」。为什么这么比喻?因为SEAF只负责转发认证请求,真正做决策的是AUSF,而UDM负责提供用户的长期密钥和认证向量。

流程大致如下:

  1. UE向SEAF发起注册请求,携带SUCI(后面会细讲)。
  2. SEAF一看,这哥们要认证,于是把请求转发给AUSF。
  3. AUSF再找UDM要认证向量。UDM根据SUCI解析出SUPI,然后生成一个包含RAND、AUTN、XRES*、KAUSF的认证向量。
  4. AUSF拿到向量后,自己再派生出一个KSEAF,然后把RAND和AUTN发给SEAF,SEAF再转发给UE。
  5. UE收到后,自己算一遍,如果AUTN验证通过,说明网络是真的。然后UE回复RES*。
  6. SEAF把RES*发给AUSF比对,如果一致,认证通过。

这里有个关键点:SEAF其实看不到用户的长期密钥,它只持有KSEAF。这种设计是为了防止SEAF被攻破后泄露用户核心密钥。我在项目中遇到过一种攻击场景,攻击者如果控制了SEAF,最多只能影响当前会话,拿不到用户的根密钥。这就是分层设计的妙处。

核心要点:5G AKA相比4G最大的变化是引入了AUSF作为独立的认证功能,实现了认证逻辑与接入网络的解耦。说白了,就是让专业的人干专业的事。

EAP-AKA'扩展:当5G需要对接非3GPP接入时

EAP-AKA',这个名字听起来有点绕。其实它就是EAP框架下的AKA协议变种。为什么要搞个「'」?因为5G需要支持非3GPP接入,比如Wi-Fi、卫星网络等。这些网络不认识标准的NAS消息,但都认识EAP。

我记得第一次在实验室调EAP-AKA'的时候,被那个「'」坑了一把。它和普通的EAP-AKA有什么区别?关键就在密钥派生上。EAP-AKA'在计算密钥时,多了一个网络标识符(Network Name)作为输入参数。这样做是为了防止「重定向攻击」——攻击者把用户从5G网络骗到一个假的Wi-Fi网络上,然后用同样的密钥去解密通信。

流程上,EAP-AKA'和5G AKA大同小异:

  • UE和SEAF之间走EAP消息。
  • SEAF把EAP消息封装在NAS里发给AUSF。
  • AUSF内部完成AKA认证,然后通过EAP-Success告知结果。

你可能会问:为什么不用统一的AKA协议?原因很简单——非3GPP接入网可能根本不支持5G NAS协议栈。EAP就像一个万能适配器,什么网络都能接。我在做物联网终端接入测试时,就遇到过只支持EAP的模组,这时候EAP-AKA'就是唯一的选择。

避坑指南:我曾经在配置EAP-AKA'时忘记设置正确的Network Name,结果UE一直认证失败。后来抓包发现,UE算出来的密钥和网络侧对不上。所以,请务必确保UE和网络侧配置的Network Name完全一致,包括大小写。

SUCI与隐私保护:让攻击者找不到北

SUCI,全称Subscription Concealed Identifier。说白了,就是用户的「马甲」。在4G时代,UE直接发送IMSI(国际移动用户识别码)给网络,这简直是给攻击者送人头。攻击者只要在空口抓包,就能拿到用户的永久身份,然后进行位置追踪或者假冒。

5G怎么解决的?UE在发送身份之前,先用网络侧的公钥对SUPI(永久身份)进行加密,生成SUCI。加密算法用的是椭圆曲线加密(ECC),具体来说是HPKE(Hybrid Public Key Encryption)。

流程是这样的:

  1. UE从网络侧获取公钥(通过注册请求的响应或者预配置)。
  2. UE用公钥加密SUPI,加上一些元数据(比如加密算法标识、公钥标识),生成SUCI。
  3. 网络侧收到SUCI后,用私钥解密,得到SUPI。

这里有个细节:SUCI不是一成不变的。UE每次生成SUCI时,都会加入一个随机数(称为「加密盐」),所以即使同一个用户,每次生成的SUCI都不同。攻击者就算抓到了SUCI,也无法关联到同一个用户。

我在做隐私保护测试时,曾经尝试过用彩虹表去破解SUCI。结果发现,因为每次加密盐都不同,彩虹表根本没用。而且ECC的密钥长度是256位,暴力破解的时间复杂度是2^128,基本不可能。

注意事项:SUCI虽然保护了用户身份,但有一个前提——网络侧的公钥必须安全分发。如果公钥被篡改,攻击者可以冒充网络,让UE用攻击者的公钥加密SUPI,然后攻击者就能解密得到永久身份。所以,公钥的分发必须走HTTPS或者预配置在USIM卡中。

密钥层次结构与派生:从根密钥到会话密钥的层层保护

5G的密钥层次结构,我称之为「洋葱模型」——剥开一层还有一层。每一层密钥都只用于特定目的,即使某一层被攻破,也不会影响其他层。

整个层次从上到下是这样的:

密钥名称 存储位置 用途 派生依据
K USIM卡和UDM 根密钥,永久不变 预置
CK/IK USIM卡和UDM 加密密钥和完整性密钥 从K通过AKA算法派生
KAUSF AUSF和UE 认证服务器密钥 从CK/IK派生
KSEAF SEAF和UE 安全锚点密钥 从KAUSF派生
KgNB gNB和UE 接入网密钥 从KSEAF派生
KRRCenc/KRRCint gNB和UE RRC信令加密/完整性密钥 从KgNB派生
KUPenc gNB和UE 用户面加密密钥 从KgNB派生

你发现没有?每一层派生都引入了新的参数,比如接入网标识、算法标识、会话随机数等。这样做的好处是:即使攻击者拿到了KgNB,也只能解密当前接入网的通信,无法回溯到KSEAF,更无法影响到其他接入网。

派生算法用的是HMAC-SHA-256或者AES-CMAC。我个人习惯用HMAC-SHA-256,因为它的安全性经过长期验证,而且实现起来不容易出错。

举个例子,从KSEAF派生KgNB的公式是:

K_gNB = KDF(K_SEAF, "5G-NAS-enc", gNB_ID, ABBA)

其中KDF是密钥派生函数,ABBA是Anti-Bidding-down Attack参数,防止攻击者诱导UE使用低版本算法。

实战经验:我在一次安全审计中发现,某个厂商的实现中,KgNB的派生没有包含gNB_ID。这意味着攻击者可以伪造一个gNB,然后用同样的KgNB去解密用户面数据。嗯,这属于典型的「密钥绑定缺失」漏洞。所以,请务必检查你的实现是否绑定了所有必要的上下文参数。

知识体系总览

下面这张图展示了本章的核心逻辑,从认证触发到密钥派生的完整链路:

5G认证与密钥协商知识体系 UE发起注册请求 携带SUCI 5G AKA / EAP-AKA' 认证流程 SEAF(守门员) 转发认证请求 AUSF(裁判) 验证RES* UDM(数据库) 生成认证向量 SUCI隐私保护机制 ECC公钥加密SUPI 每次生成不同SUCI 网络侧私钥解密 密钥层次结构与派生 K → CK/IK → K_AUSF → K_SEAF → K_gNB

好了,以上就是5G认证与密钥协商的核心内容。从AKA协议流程到EAP-AKA'的扩展,从SUCI隐私保护到密钥层次结构,每一步都环环相扣。你想想看,如果没有这些机制,5G网络的安全就无从谈起。下一节我们会深入探讨这些密钥在实际信令流程中是如何被使用的,以及攻击者可能利用的漏洞点。

个人建议:如果你刚开始接触5G安全,建议先动手搭建一个开源的核心网模拟环境(比如free5GC),然后抓包分析AKA流程的每条消息。纸上得来终觉浅,绝知此事要躬行。

专注资料整理