转:浅谈Radius协议 -来自CSDN:http://blog.csdn.net/wangpengqi/article/details/17097221
从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下,从RADIUS协议谈谈对身份认证的认识,也总结一下自己。
一.RADIUS协议原理
RADIUS(Remote Authentication Dial In User Service) 用户远程拨入认证服务,它主要针对的远程登录类型有:SLIP、PPP、telnet和rlogin等。RADIUS协议应用范围很广,包括普通电话、上网业务计费,对VPN的支持可以使不同的拨入服务器的用户具有不同权限。
RADIUS典型应用环境如下:
RADIUS数据包分为5个部分:
(1) Code:1个字节,用于区分RADIUS包的类型:常用类型有:
接入请求(Access-Request),Code=1;接入允许(Access-Accept),Code=2;接入拒绝(Access-Reject),Code=3;计费请求(Accounting-Request),Code=4等。
(2)Identifier:一个字节,用于请求和应答包的匹配。
(3)Length:两个字节,表示RADIUS数据区(包括Code, Identifier, Length, Authenticator, Attributes)的长度,单位是字节,最小为20,最大为4096。
(4)Authenticator:16个字节,用于验证服务器端的应答,另外还用于用户口令的加密。RADIUS服务器和NAS的共享密钥(Shared Secret)与请求认证码(Request Authenticator)和应答认证码(Response Authenticator),共同支持发、收报文的完整性和认证。另外,用户密码不能在NAS和RADIUS 服务器之间用明文传输,而一般使用共享密钥(Shared Secret)和认证码(Authenticator)通过MD5加密算法进行加密隐藏。
(5)Attributes:不定长度,最小可为0个字节,描述RADIUS协议的属性,如用户名、口令、IP地址等信息都是存放在本数据段。
各个属性的详细编码信息,以及数据格式,限于篇幅,这里不作具体介绍,感兴趣的,可以参看RFC文档,或与我交流。
二.RADIUS协议实现
目前,开源软件包freeRadius , tinyRadius,可以下载到其实现的源码。freeRadius是目前功能最强大的开源RADIUS 服务器软件,采用C语言实现,采用了多进程,进程池的处理方法,拥有很好的吞吐处理能力,同时,提供了连接各种数据库的应用接口,方便用户根据自己的需要进行适当的扩展。值得一提的是,它采用模块化处理,用户可以定做适合自己的认证计费处理模块。
freeRadius的功能强大,也造成了它模块的庞大,不易维护,对安装环境有一些要求。tinyRadius采用Java开发,短小精悍,能接收各种标准协议中的数据包,可以快速的完成对RADIUS数据包的封装与解包,我们可以自己的需要进行某些处理,具有很大的自由度,唯一的缺陷是单线程,没有数据库接口。
三.RADIUS协议对安全的考虑
RADIUS采用UDP协议基于以下几点原因:
1. NAS和RADIUS服务器大多在同一个局域网中,使用UDP更加快捷方便。
2. 简化了服务端的实现。
事实证明,采用UDP协议可行,RADIUS有自己的机制,来解决UDP丢包特点。
如果NAS向某个RADIUS服务器提交请求没有收到返回信息,那么可以要求备份RADIUS服务器重传。由于有多个备份RADIUS服务器,因此NAS进行重传的时候,可以采用轮询的方法。如果备份RADIUS服务器的密钥和以前RADIUS服务器的密钥不同,则需要重新进行认证。
下面重点从RADIUS协议来谈下它在身份认证中如何确保安全认证的。
1. Authenticator:鉴别码,分为请求鉴别码,回应鉴别码。
在“Access-Request”数据包中,Authenticator是一个16字节的随机数,称为“Request Authenticator”。 在机密的整个生存周期中(如RADIUAS服务器和客户端共享的机密),这个值应该是不可预测的,并且是唯一的,因为具有相同密码的重复请求值,使黑客有机会用已截取的响应回复用户。因为同一机密可以被用在不同地理区域中的服务器的验证中,所以请求认证域应该具有全球和临时唯一性。
为防止数据包中数据被截获被篡改,回应鉴别码采用如下方式生成:
ResponseAuth = MD5(Code+ID+Length+RequestAuth+ Attributes+Secret);
回应鉴别码是对整个数据包进行MD5演算产生的16字节索引,防止伪造服务器的回应。
2.加密方式。PAP,CAHP,EAP以及Unix登录认证三种加密认证方式。最常用的是前两种,下面介绍下:
PAP加密,采用此加密方法时,密码存放在User-Password属性中。
User-Password加密方法:
1.在密码的末尾用nulls代替填补形成多个十六个字节的二进制数;
2.把密码按16个字节为一组划分为p1、p2等等;
b1=MD5(Secret + Authenticator) c(1) = p1 异或 b1
b2 = MD5(S + c(1)) c(2) = p2 异或b2
.
.
.
bi = MD5(S + c(i-1)) c (i) = pi 异或 bi
c(1)+c(2)+...+c (i)
在接收时,这个过程被反过来,由于采用异或方式贯穿在每16个字节之间,同样的算法再异或一次,然后配合MD5演算,从而生成原始的密码,尽管这种加密方式是可逆的,黑客截获到密文后,能通过一定的手段来破解出密码,但如果共享密钥未知的情况下,很难破解,也就只能采用蛮力破解方法。使用共享密钥应采用合适的长度,来防止破解,不应过短。
PAP加密方法使密码以密文的方式在网络中进行传输,使黑客仍有有机可乘的机会,但CHAP加密方法阻止了密码的传输。
CHAP加密,采用此加密方法时,密码存放在Chap-Password属性中。
这种加密方法的原则是不是密码在网络中进行传输,而只是传输一个索引值,从而增加了安全性,但这样做的代价是,RADIUS服务端必须要知道用户的密码,从而再现密码索引值来和发来的认证请求中的密码索引值比对。
Chap-Password加密方法:
Md5(chapId+password+chapChallenge);
chapId :可以是随机产生的一字节码;
chapChallenge :NAS生成一个随机挑战字(16个字节比较合适)
该字段有时缺失,读取Authenticator域作为挑战字。
3.共享密钥(Secret):共享密钥在密码加密以及数据包的鉴别码部分都参与了运算,即使RADIUS数据包被截获,但不知道共享密钥,很难破解用户的密码伪造数据。共享密钥应采用合适的长度,不应过短,宽大密码范围能有效提供对穷举搜寻攻击的防卫,随着密钥长度的增加,其破解花费的时间将大大增加。
4.为防止非法用户的重放攻击,造成服务器瘫痪。如果在一个很短的时间片段里,一个请求有相同的客户源IP地址、源UDP端口号和标识符,RADIUS服务器会认为这是上一个重复的请求,将直接丢弃,不做任何处理。
四.总结
Radius协议本身比较易掌握,在应用中,可以结合其自身的密码方式,实现满足企业需要的更高强度的强认证,比如结合各种令牌卡,手机短信等等。对协议进行开发,离不开各种抓包工具,像sniffer,tcpdump,ethereal等抓包工具的使用。
外部用户要访问某局域网络中计算机设备,其访问方式有多种,比如采用VPN拨号,Telnet等等。如用户Telnet登陆时,产生用户名和密码信息,而NAS服务器AAA配置中指定了采用RADIUS作为认证服务器,则将其封装成RADIUS请求数据包发送到RADIUS服务器进行身份认证,RADIUS服务器通过NAS和用户进行交流,以提示用户认证通过与否,以及是否需要Challenge身份认证。
其工作原理为:用户接入NAS (Net Access Server),NAS一般为路由器等设备,NAS向RADIUS服务器使用Access-Request数据包提交用户信息,包括用户名、密码等相关信息,其中用户密码是经过MD5加密的,双方使用共享密钥,这个密钥不经过网络传播;RADIUS服务器对用户名和密码的合法性进行检验,必要时可以提出一个Challenge,要求进一步对用户认证,也可以对NAS进行类似的认证;如果合法,给NAS返回Access-Accept数据包,允许用户进行下一步工作,否则返回Access-Reject数据包,拒绝用户访问;如果允许访问,NAS向RADIUS服务器提出计费请求Account-Require,RADIUS服务器响应Account-Accept,对用户的计费开始,同时用户可以进行自己的相关操作。
RADIUS还支持代理和漫游功能。简单地说,代理就是一台服务器,可以作为其他RADIUS服务器的代理,负责转发RADIUS认证和计费数据包。所谓漫游功能,就是代理的一个具体实现,这样可以让用户通过本来和其无关的RADIUS服务器进行认证。
RADIUS能够实现其功能依赖于它自身的数据包结构。RADIUS采用的是UDP传输协议,认证和计费监听端口一般分别为:1812,1813。
以太网上的RADIUS封装后的包结构如下:
以太帧头 |
IP包头 |
UDP包头 |
RADIUS数据包 |
以太网FCS |
在这里我们关心的是红色RADIUS数据包部分。
RADIUS数据包的格式如下:
转:浅谈Radius协议 -来自CSDN:http://blog.csdn.net/wangpengqi/article/details/17097221的更多相关文章
- 【转】 浅谈Radius协议
浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报 分类: Radius协议分析(6) 从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...
- 将博客搬至CSDN https://blog.csdn.net/Fredric_2014
将博客搬至CSDN https://blog.csdn.net/Fredric_2014
- 将博客搬至CSDN http://blog.csdn.net/yi_xianyong
将博客搬至CSDN http://blog.csdn.net/yi_xianyong
- 浅谈FIle协议与Http协议及区别
背景 先看三段代码: index.html: <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 浅谈 HTTP协议
1.什么是http协议Hyper Text Transport Portocal(超文本传输协议)HTTP协议是应用层协议浏览器和web服务器通讯时遵守的约定互联网使用最多的协议提供超文本的传输服务通 ...
- 浅谈HTTP协议(下)
下面来讲响应消息.响应消息也分为响应起始行.响应头部.CRLF.响应主体. 响应起始行包括协议版本.响应状态码.原因短句.这里的重点就是响应状态码,它一共分为5类,状态码准确的说是一个三位数. 1xx ...
- 浅谈HTTP协议(上)
今天讨论一下HTTP协议.一个做前端的,如果连HTTP协议都不了解,那实在是太不合格了. 首先,什么是HTTP?Hyper Text Transfer Protocol(超文本传输协议),用在浏览器和 ...
- 浅谈HTTP协议
1 HTTP概念 把握三个点: 1 HTTP协议(超文本传输协议) HTTP是一个基于TCP/IP通信协议来传递数据,默认端口80 2 HTTP是无连接(限制每次连接只处理一个请求),无状态的(对于事 ...
- 浅谈Http协议是怎么回事?
老实说关于http协议这个概念,见到最多的还是各类招聘信息.在平时的工作中,除了了解一些请求,响应,请求头这些概念外,对于http协议也没有太多的关心.因为貌似对平时的工作没有什么影响,所以在写这篇关 ...
随机推荐
- Android -- 使用inBitmap要注意的地方
SDK版本 需要注意的是inBitmap只能在3.0以后使用.2.3上,bitmap的数据是存储在native的内存区域,并不是在Dalvik的内存堆上. 在android3.0开始,系统在Bitma ...
- ubuntu 16.04 mysql 相关
如何彻底卸载某一版本的数据库 彻底删除ubuntu下的mysql: 1.删除mysql的数据文件 sudo rm /var/lib/mysql/ -R 2.删除mqsql的配置文件 sudo rm / ...
- 20135220谈愈敏Linux_总结
Linux_总结 具体博客链接 计算机是如何工作的 操作系统是如何工作的 构造一个简单的Linux系统MenuOS 系统调用(上) 系统调用(下) 进程的描述和创建 可执行程序的装载 进程的切换和系统 ...
- Jenkins进阶系列之——08Jenkins纳入版本控制
2014-07-25:更新shell脚本 2014-06-05:更新shell脚本 2014-01-09:更新shell脚本,修改Jenkins文件删除后不能自动从版本控制删除的bug 是不是有过这种 ...
- WebAPI2使用Autofac实现IOC属性注入完美解决方案
一.前言 只要你是.NETer你一定IOC,IOC里面你也会一定知道Autofac,上次说了在MVC5实现属性注入,今天实现在WebApi2实现属性注入,顺便说一下autofac的程序集的注入方式,都 ...
- 从实用主义深入理解c++虚函数
记得几个月前看过C++虚函数的问题,当时其实就看懂了,最近笔试中遇到了虚函数竟然不太确定,所以还是理解的不深刻,所以想通过这篇文章来巩固下. 装逼一刻: 最近,本人思想发生了巨大的转变,在大学的时候由 ...
- js方式清空表单数据的两种方式
方法1:遍历页面元素 /* 清空FORM表单内容 id:表单ID*/ function ClearForm(id) { var objId = document.getElementByI ...
- SqlDependency数据库同步+signalr 推送消息
sqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. ...
- python 读写文件和设置文件的字符编码
一. python打开文件代码如下: f = open("d:\test.txt", "w") 说明:第一个参数是文件名称,包括路径:第二个参数是打开的模式mo ...
- Android4.4中不能发送SD卡就绪广播
当在Android上进行图片的扫描功能开发时一般会使用:sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(“file:// ...