标签:jsb 发送 passwd 机制 pen 期望 linux系统 通过 散列函数
@auth doubleRabbit
@date 2017-03-14
鉴权是指用户访问系统的权利,是提升系统安全性的一种方式,传统鉴权方法就是用户名与密码。
鉴权与授权的区别联系。逻辑上授权过程发生在鉴权之后,而实际中有时鉴权与授权对于用户来说体现为同一过程。例如在EPC附着过程中,先发生AIA鉴权过程,再发生ULR位置更新过程(授权)。
接下来讲的是针对通信类业务应用场景,具体涉及IMS注册流程。
单向鉴权:用户鉴权,即网络对用户鉴权,防止非法用户接入网络。
双向鉴权:用户鉴权与网络鉴权。网络鉴权即用户鉴权网络,防止用户接入了非法的网络,例如伪基站。
手机入网采用信号强弱来进行选择,伪基站一般发射功率大,相信很多人在2G/3G情况下都碰到过这种情况下,当你到过某一区域时,手机突然离线马上又上线,收到诈骗与广告信息,此时打不通电话,离开一段距离后,又恢复正常。这是由于2G/3G时代采用单向鉴权,伪基站鉴权用户时直接通过,附着上然后获取到了你的手机号与卡信息,给你发信息,如果双向鉴权的话,伪基站不知道卡的密码信息,手机鉴权网络是肯定不通过的。
鉴权机制是指鉴权过程的执行方式,机制它规范了业务的操作流程。
摘要认证,HTTP/1.0中包括了基本访问鉴别方案,该方案是采用明文的用户名与密码在网络传输,这样非常的不安全,后来发展成为基于哈希加密方式的摘要认证方式,摘要认证的基本意思为取需要认证的一部分信息,然后利用哈希加密方法计算得出其比较值。其根据使用协议分为HTTP摘要认证与SIP摘要认证,两者的计算方法一样,只是涉及到协议的字段含义不一样而己。
SIP摘要:适用于无ISIM 卡的移动和固定终端
HTTP摘要
IMS AKA(AKAV1_MD5与AKAV2_MD5):适用于具有ISIM 卡的移动和固定终端,是对HTTP摘要认证的扩展,主要用于用户的认证和会话密钥的分发
EARLY_IMS
NASS_BUNDLED
鉴权机制 | 鉴权类型 |
---|---|
HTTP摘要 | 单向 |
SIP摘要 | 单向 |
IMS AKA | 双向 |
鉴权算法是指鉴权过程中相关值(原始值、中间值及终值)的生成方法。
Message Digest Algorithm MD5,为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。另外散列函数还有sha-1
,具有以下特点。
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的
- 容易计算:从原数据计算出MD5值很容易
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别
- 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。目前各个版本语言都有其开源的实现,如linux系统下的实现文件(md5.h/md5.c)。
Base64是一种用64个字符来表示任意二进制数据的方法。其64个字符如下。
[‘A‘, ‘B‘, ‘C‘, ... ‘a‘, ‘b‘, ‘c‘, ... ‘0‘, ‘1‘, ... ‘+‘, ‘/‘]
然后对二进制数进行处理,以每3个字节一组,共24位,再次进行划分为4组,以6bit表示一组,最后以6bit一组所代表的数值进行查64个字符表中该位置所对应的字符,所得出的字符即为编码后的字符。可想而知Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%。
如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。
Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
示例:
EFHcj+MdcOJcptPq9IiBG+K8+3koDIAALYGFWwW8BZM=
解码:以上示例总为44个字符,即44*6=264
个bit,由于末尾有一个=
表示补充了1个字节8位,所以真实长度为264-8=256
位,即标准32个字节。
AKA机制是由IETF制定、并被3GPP采用,广泛用于3G无线网络的鉴权机制。IMS的鉴权机制沿用了这种机制的原理和核心算法,算法的详细介绍查阅TS33.102文档。
以上为AKA算法的原理结构图,AKA算法有Milenage
与XOR
两种具体实现方式,一般常用Milenage
实现方式,目前对于算法基本(f1-f5)实现均有不同语言的开源实现。
参数 | 长度(bits) | 备注 |
---|---|---|
SQN | 48 | 序列号 |
AK | 48 | 匿名钥匙 |
CK | 128 | 加密密钥 |
IK | 128 | 完整性密钥 |
AMF | 16 | 鉴权管理域 |
MAC | 64 | 消息鉴权码 |
MAC-A | 64 | 网络鉴权码,一般鉴权时作为MAC值 |
MAC-S | 64 | 重同步鉴权码,重同步鉴权时作为MAC值 |
RES | 64 | 鉴权响应 |
XRES | 64 | 期望鉴权响应,HSS下发给MME,UE响应后计算响应与此比较,一致则通过 |
c1,c2,c3,c4,c5 | 128 | 常数,与或运算的中间变量 |
r1,r2,r3,r4,r5 | 0-127的整数,目标参数的周期性旋转量 |
Milenage算法使用的符号含义
符号 | 备注 |
---|---|
= | 等于 |
十字圆 | 与或运算 |
|| | 串联运算,如0000||1111=00001111 |
IMS作为IP融合架构下统一的呼叫会话控制中心,详细的网元意图在些不表,涉及到的协议为SIP、Diameter,在UE接入注册时需要执行鉴权过程,如下图所示。
鉴权关键点:
1,第6步SCSCF向HSS通过MAR请求鉴权向量AV,图为五元向量组,实际为四元向组(AUTH,XRES,CK,IK);
2,第16步SCSCF计算UE的挑战回应。
抓包流程如下
信令内容如下
1,UE发起REGISTER消息,携带注册内容与鉴权相关参数,nonce与response均为空;
Security-Client: ipsec-3gpp;alg=hmac-sha-1-96;prot=esp;mod=trans;ealg=des-ede3-cbc;spi-c=10056063;spi-s=50257488;port-c=31100;port-s=31800,ipsec-3gpp;alg=hmac-sha-1-96;prot=esp;mod=trans;ealg=aes-cbc;spi-c=10056063;spi-s=50257488;port-c=31100;port-s=31800,ipsec-3gpp;alg=hmac-sha-1-96;prot=esp;mod=trans;ealg=null;spi-c=10056063;spi-s=50257488;port-c=31100;port-s=31800,ipsec-3gpp;alg=hmac-md5-96;prot=esp;mod=trans;ealg=des-ede3-cbc;spi-c=10056063;spi-s=50257488;port-c=31100;port-s=31800,ipsec-3gpp;alg=hmac-md5-96;prot=esp;mod=trans;ealg=aes-cbc;spi-c=10056063;spi-s=50257488;port-c=31100;port-s=31800,ipsec-3gpp;alg=hmac-md5-96;prot=esp;mod=trans;ealg=null;spi-c=10056063;spi-s=50257488;port-c=31100;port-s=31800
Authorization: Digest username="460001023420005@ims.mnc000.mcc460.3gppnetwork.org",
realm="ims.mnc000.mcc460.3gppnetwork.org",
uri="sip:ims.mnc000.mcc460.3gppnetwork.org",
nonce="",response=""
2,SCSCF针对初始注册发起401鉴权挑战,注入nonce值;
WWW-Authenticate: Digest nonce="EFHcj+MdcOJcptPq9IiBG+K8+3koDIAALYGFWwW8BZM=",
algorithm=AKAv1-MD5,
realm="ims.mnc000.mcc460.3gppnetwork.org",
ik=c38457266f24afc342f74258a1c9bd48,
ck=8301e8fb4ac1a2e45e591c3a00c08a2f
3,UE回应挑战,SCSCF鉴权用户响应
Authorization: Digest nonce="EFHcj+MdcOJcptPq9IiBG+K8+3koDIAALYGFWwW8BZM=",
username="460001023420005@ims.mnc000.mcc460.3gppnetwork.org",
uri="sip:ims.mnc000.mcc460.3gppnetwork.org",
realm="ims.mnc000.mcc460.3gppnetwork.org",
algorithm=AKAv1-MD5,
response="230aecb0480f1db901de081c8b62b964",
integrity-protected="yes"
IMS AKA鉴权流程涉及到终端UE、PCSCF、SCSCF及HSS网元,UE与HSS共享统一的密钥,HSS充当鉴权中心生成鉴权向量,不会将原始的密钥暴露在网络上,PCSCF与UE之间建立IPSEC安全通道,直接与UE之间传输通信,SCSCF负责以HSS的鉴权向量为基准真正执行鉴权决策过程。大体流程如上一节己讲,接下来讲一下与鉴权相关的具体实现过程。
1,UE发起初始REGISTER请求,即一个不带integrity-protected
参数的或者在认证头中integrity-protected
参数设为No
的REGISTER请求,且Authorization头域中NONCE
与RESPONSE
字段值为空,指明鉴权机制为摘要认证,消息经P/ICSCF传递给SCSCF,SCSCF向HSS发送MAR请求鉴权向量,HSS生成四元鉴权向量组过程如下;
AV = AUTH||XRES||CK||IK
AUTH = SQN@AK || AMF || MAC
MAC = F1K(SQN || RAND || AMF)
CK = F3K(RAND)
IK = F4K(RAND)
AK = F5K(RAND)
XRES = F2K(RAND)
2,SCSCF收到鉴权向量后,将AUTH值经过Base64
编码后填充到401响应的Authorization头域中的nonce字段中,并且将IK与CK值填充到ik与ck字段中,这两值不需要编码,因为属于内部网元之间的数据交换;
3,PCSCF收到SCSCF发送的响应,协商建立与UE之间的IPSEC通道,并且将CK与IK字段去掉,然后将消息发送给UE;
4,UE收到401呼应后,通过如下方法计算XMAC值与NONCE值中的MAC值进行比较,如果通过则发起第二次REGISTER请求(CSeq递增),说明用户鉴权网络成功,否则继续发送第一次REGISTER请求;
5,SCSCF收到第二次REGISTER请求后,该请求携带UE计算好的RESPONSE
值,SCSCF按摘要认证的方式计算出期望的RESPONSE
值,如果两者一致则说明网络鉴权用户成功,从而完成整个双向鉴权的过程,否则返回错误响应。
A1 = unq(username-value) ":" unq(realm-value) ":" passwd // 特别注意此处的passwd即为从HSS获取的xres值
A2 = Method ":" digest-uri-value
RESPONSE=MD5(MD5(A1),":" nc-value":" unq(cnonce-value)":" unq(qop-value)":" MD5(A2))
IMS:移动领域的IP多媒体概念和服务
RFC 2617 摘要认证
RFC 3261 初始会话控制协议
RFC 3588 Diameter基础协议
3GPP TS35.206 33.102 AKA核心算法
如有讲述不当之处,请批评指正。
标签:jsb 发送 passwd 机制 pen 期望 linux系统 通过 散列函数
原文地址:http://blog.csdn.net/mao_2110901055/article/details/65629620