折腾raidus中,请教rfc2865,2866
朋友需要,摆弄winraidus,然后才发现这玩意居然不支持pptp、l2tp......一气之下自己动手写raidus,努力翻看rfc2865,2866,好像也挺简单,各主要段落很快就被拆分(方便理解),唯一的就是在理解Authenticator的时候卡住了,楞是没在字面上理解request authenticator及response authenticator的算法,反正我按照公式算出来的结果和预期的总是对不上-_-",我猜我应该是理解错公式了另问,2865、2866两者之间究竟是什么关系?什么设备支持2865什么设备支持2866?raidus怎知道送过来的是2865还是2866请求(貌似两者就authenticator的算法不一样)? 你参考下freeradius的源码不就OK了。
主要看里面的mschap那个模块的代码,然后copy一些过来,呵呵 在电脑上找到这个
RADIUS协议的包格式(2007-07-19 00:12:08) 分类:技术文档
1、 RADIUS协议的包格式
RADIUS数据包是被封装在UDP的数据域中的。
RADIUS的包数据格式如下所示,各域(Fields)的先后次序是从左到右。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code |Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Authenticator |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Attributes ...
+-+-+-+-+-+-+-+-+-+-+-+-+-
Code
Code域有一个字节长度,用来标示RADIUS通信包的类型。当收到一个非法的包类型,将被丢弃。
Code可代表如下类型(十进制):
1 Access-Request
2 Access-Accept
3 Access-Reject
4 Accounting-Request
5 Accounting-Response
11 Access-Challenge
12 Status-Server (experimental)
13 Status-Client (experimental)
255 Reserved
Identifier
Identifier有一个字节长度,用来匹配RADIUS的请求和应答。
Length
Length有2个字节长度,它标明整个RADIUS数据包的长度,包括:Code, Identifier, Length, Authenticator 和Attributes。Length的最小值为20,最大值为4096。RADIUS的应用程序将丢弃小于20的包;对大于4096的包将把超出部分丢弃,只处理有效部分(超出部分被认为是填充域)。
Authenticator
Authenticator域有16个字节。这个域用来完成安全性检查,所以是非常重要的。Authenticator的作用有两个,一个是验证从RADIUS服务器返回的应答;另一个是为对口令部分加密算法做参数。
有两种Authenticator:
1) Request Authenticator
出现在通信包“Access-Request”中,是长度为16字节的随机二进制串。格式为:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code |Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Request Authenticator |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Attributes ...
+-+-+-+-+-+-+-+-+-+-+-+-+-
RADIUS协议建议Request Authenticator应该是不可预测和在整个生命期内是唯一的。这是为了防止攻击者伪装成通信的一方的措施。RADIUS请求方(NAS)用Request Authenticatior加密用户密码;相反,RADIUS服务器则用它来对用户密码,并生成应答包的Authenticator(Response Authenticatior)。如果Request Authenticator不是唯一的话,网络窃听者将可以伪造RADIUS服务器的应答,因为此时Response Authenticator的加密算法有相同的参数(详见下文)。
用户密码部分的加密算法是:
enpassword = password XOR MD5(secret + Request Authenticator)
2) Response Authenticator
出现在通信包“Access-Accept”、“Access-Reject”、“Access-Challenge”和“Accounting-Response”中。格式为:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code |Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Response Authenticator |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Attributes ...
+-+-+-+-+-+-+-+-+-+-+-+-+-
Response Authenticator产生的算法:
Response Authenticator =
MD5(Code + Id + Length + Req-Authenticator + Attributes + Secret) 我知道,我也看过了,单就是在这里迷糊了...
你这是2865的,算法是 enpassword = password XOR MD5(secret + Request Authenticator)
和 Response Authenticator = MD5(Code + Id + Length + Req-Authenticator + Attributes + Secret)
但在2866里则是 Code+Identifier+Length+16个值为0的字节+请求属性+共享密钥 和 MD5( Code+Identifier+Length+对应的计费请求包的请求认证字+回应属性(如果有的话)+共享密钥 )
2865里有示范性的应答报文,但我无论怎理解 password XOR MD5(secret + Request Authenticator) ,得出的结果依然和2865里的示范结果不一致-_-" 搞半天终于搞定 password XOR MD5(secret + Request Authenticator) ,也算重要突破了,的确是理解错误.........
有谁有更多资料或者曾经折腾过的,来点经验之谈? 又见高手 鸡动ing :lol 呵呵,不错,自己动手,本来也想研究一下,不过现在暂时不研究了。 楼上的,api那那里俺也初步搞明白了....嘿嘿...半桶水就是郁闷,在这里被称呼高手,但在编程论坛俺却被损了半天-_-" 支持!慢慢研究吧。呵呵。
页:
[1]