📄 自己动手编写linux下的校园网客户端
字号:
虽然港湾网络不是标准的802.1x协议,但它主要参照了802.1x协议,其认证步骤,用户名的加密等等仍然是使用了802.1x协议的标准。一、 802.1x协议工作机制: 在802.1X协议中,只有具备了以下三个元素才能够完成基于端口的访问控制的用户认证和授权。 1.客户端:一般安装在用户的工作站上,当用户有上网需求时,激活客户端程序,输入必要的用户名和口令,客户端程序将会送出连接请求。 2.认证系统:在以太网系统中指认证交换机,其主要作用是完成用户认证信息的上传、下达工作,并根据认证的结果打开或关闭端口。 3.认证服务器:通过检验客户端发送来的身份标识(用户名和口令)来判别用户是否有权使用网络系统提供的网络服务,并根据认证结果向交换机发出打开或保持端口关闭的状态。 当一个用户需要对网络资源进行访问之前必须先要完成以下的认证过程。 1.当用户有上网需求时打开802.1X客户端程序,输入已经申请、登记过的用户名和口令,发起连接请求。此时,客户端程序将发出请求认证的报文给交换机,开始启动一次认证过程。 2.交换机收到请求认证的数据帧后,将发出一个请求帧要求用户的客户端程序将输入的用户名送上来。 3.客户端程序响应交换机发出的请求,将用户名信息通过数据帧送给交换机。交换机将客户端送上来的数据帧经过封包处理后送给认证服务器进行处理。 4.认证服务器收到交换机转发上来的用户名信息后,将该信息与数据库中的用户名表相比对,找到该用户名对应的口令信息,用随机生成的一个加密字对它进行加密处理,同时也将此加密字传送给交换机,由交换机传给客户端程序。 5.客户端程序收到由交换机传来的加密字后,用该加密字对口令部分进行加密处理(此种加密算法通常是不可逆的),并通过交换机传给认证服务器。 6.认证服务器将送上来的加密后的口令信息和其自己经过加密运算后的口令信息进行对比,如果相同,则认为该用户为合法用户,反馈认证通过的消息,并向交换机发出打开端口的指令,允许用户的业务流通过端口访问网络。否则,反馈认证失败的消息,并保持交换机端口的关闭状态,只允许认证信息数据通过而不允许业务数据通过。 二、 结合我发布的那个Linux_client的代码,是这样一种情况: 1. sendStartPacket 其中有32字节的数据域是变动的,由于不清楚生成算法,我只是简单地将这部分内容拷贝。试验的效果还算理想。如果谁有更好的方法,请告诉我。 2. 收到一个应答包,要求我们将用户名发送过去。记录ID号,偏移为 0x13 的一个字节。 3. sendNamePacket 填充用户名和ID号,然后发送出去。 4. 如果用户名正确,将会收到一个应答包,要求我们用指定的加密字加密口令。这里非常关键,也是最初困惑我的一个问题之一,我找了很多资料才知道加密的具体内容。 加密算法: MD5 加密内容: ID号(offset 0x13 的一个字节) + 口令 + 密钥(offset 0x18 的16个字节) 组成的一个字符串 加密结果: 16字节的密文 5. sendPasswordPacket 填充16字节的密文和ID号,然后发送出去。 6. 如果一切顺利,我们将收到成功登录的消息。 ……(传说中的“正在网络上注册您的计算机...“) 调用 dhclient -r 释放当前的IP地址 调用 dhclient eth0 为eth0分配IP地址 …… 但一切都没完,到现在为止我们仅是成功的登录而已,如果没有下面的步骤,我们会在1分半钟左右掉线。 7. sendNotifyPacket 将我们的IP设置告诉服务器。包括IP地址(offset 0x18 的4个字节),子网掩码(offset 0x1e 的4个字节),网关(offset 0x24 的4个字节),DHCP服务器(offset 0x2A 的4个字节)。很遗憾我找了很久没找到如何用编程的方法即时地获取当前IP设置的方法,以至于在mystar.conf文件中采用了那么古怪的方法来让用户来填写这一部分信息,降低的这个程序的通用性。如果谁有更好的方法,请告诉我。 8. sendEchoPacket 此后的每2分钟,我们需要发送一个数据包,用来维护这个客户端的活跃状态,告诉服务器我们还活着。 9. sendLogoffPacket 退出登录很简单,发送一个退出的数据包就可以了,在你按下Ctrl+C之后执行。 三、补充 我是在WINDOWS下面使用Ethereal来拦截港湾的认证过程的。由于都是正常的登录,所以出错的数据包一般情况下我是看不到的,故而程序中没有考虑过多的出错情况,和出错原因的描述——如果你看到了,那么不要相信这些描述,这些描述是我胡思乱想的产物。 MD5加密算法是在网上找的,它提供的借口的内存分配非常古怪,居然是返回一个static的堆栈的数组,我试了几次都是乱码(数组地址的返回的时候出错了?),结果我就将modifyPassword直接放到它给的接口里面了。hashMD5的返回值没有任何意义。 我的Email是:wfjreyu@gmail.com
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -