樊扬轲 唐杰
摘要:针对当前层出不穷的网络安全问题,设计并实现了一个具有高并发功能的认证服务器。该文采用了RSA和DES算法来保证信息传输的安全性,采用epoll和线程池技术来保证其具有高并发功能。分别设计了集成测试和压力测试用例对服务器的稳定性和可靠性进行了测试。实验结果表明,认证服务器在高负载的情况下运转正常。
关键词:认证服务器;多线程;对称加密
中图分类号:TP309 文献标识码:A 文章编号:1009-3044(2015)24-0047-03
Designed and Implemented an Authentication Server with High Concurrency
FAN Yang-ke1, TANG Jie2
(1. College of software Shenyang Normal University,Shenyang 110127, China; 2. Hunan University of arts and Science, Changde 415003, China)
Abstract: In view of the current network security problems emerge in endlessly, designed and implemented an authentication server with high concurrency. This paper adopted the RSA and DES algorithm to ensure the security of information transmission, epoll and thread pool technology is used to ensure the high concurrency. Respectively designed integration test and stress test cases to test the stability and reliability of the server. The experimental results show that the authentication server in the case of high load operating normally.
Key words: authentication server; multithreading; symmetric encryption
为了保障信息的安全性,我们一般都采取了数据加密和身份认证的措施。目前,数据的加密与认证广泛地运用在基于http协议的web服务器中,比如网站的登录、网上支付等。自从“棱镜”事件曝光后,如何在越来越广的范围内保护我们的隐私,成为了现在的热点问题。一个高并发的服务器是在短时间内同时处理大量的来自客户端请求的一个系统。而现在常用的服务器如WEB服务器,游戏服务器。并发性都是有限的,因此对服务器并发的研究具有很强的现实意义。本文介绍一种高并发功能的认证服务器设计。
1 服务器端的总体设计
1.1 系统总体框架
本系统采用C/S设计模式,其中必不可少的是套接字编程。高并发认证服务器的任务是服务器对客户端的身份做一个认证。认证服务器首先生成一对公私钥对,在接到客户端发来的认证请求后,服务器将公钥发给客户端,客户端接到服务器端的响应后,生成DES密钥,用接收来的服务器公钥加密用户帐号UID,用户口令USEPASSWORD,用户的DES密钥DESKEY等信息,并将其发送给服务器,服务器用私钥解密数据后,验证用户身份的合法性,其序列图如图1所示:
1.2 服务端框架
目前基于流式套接字的并发服务器是Linux网络服务器主流形式。传统的基于多进程和select机制的并发服务器由于受到系统资源和Linux内核版本的限制,已经不能满足高并发的要求。根据图1的描述,本系统采用了epoll和线程池技术,设计了一个大并发认证服务器。服务器利用一个监听线程,接受客户端的请求后放入连接缓冲区,使用epoll技术来做事件触发,再由线程池中的处理线程处理客户端发来的认证请求。处理线程需要将客户信息解密后与存放在MySQL数据库中的信息进行比对,从而完成认证过程。其总体结构图如图2所示。
1.3 epoll服务器流程
服务器的主要工作流程是:① 当启动客户端后,先应确保程序的单实例运行,然后初始化运行日志,初始化完成后系统就会读取服务器的配置文件,进行命令解析。② 服务器创建并初始化线程池,创建网络环境并初始化参数,调用epoll_create 函数来创建一个epollfd 的文件描述符。③ 调用epoll_ctl 函数将监听套接字注册到epoll 事件的等待队列中。④ 设计在一个“死循环”中,调用调用epoll_wait 阻塞等待注册在epoll 上的sockfd 事件的发生,依次处理到来的事件,如果到来的的事件是监听事件,就调用accept 函数来产生连接套接字,并且将这个套接字也设置成非阻塞的状态注册到epoll 的事件等待的队列中,如果到来的事件是表明有已经连接的客户端的通信数据到来,就向线程池中抛入一个任务。同时唤醒空闲的任务线程来处理相关的认证业务请求。该设计最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。
1.4 信息处理模块
主要完成功能是生成RSA公钥对,通过对用户类型判断,验证客户身份,回复客户端。
1.5 加密设计模块
基于“对称密钥”的加密算法DES算法,把64位的明文输入块变为数据长度为64位的密文输出块,其中8位为奇偶校验,另外56位作为密码的长度。
2 关键技术
2.1 Socket编程服务器设计
在本系统中,服务器的设计思想如下:
1)首先,在使用socket之前,要首先初始化socket,就是使用socket 函数来建立一个套接字,用来完成通信的监听。
int socket(int domain,int type,int protocol);
2)在初始化完成以后,利用bind函数绑定一个端口和IP地址。
int bind(int sockfd,struct sockaddr * my_addr,int addr,int addrlen);
3)调用listen函数,使服务器的这个端口和IP处于监听状态,等待客户机的连接。
int listen(int s ,int backlog);
4)使用accept函数来接收远程计算机的连接,建立起与客户机之间的通信。
int accept(int s,struct sockaddr *addr ,int * addrlen);
5)在通信的过程中,服务器端的产生的新的socket会通过一个消息响应函数recv函数来接收到达的数据。数据的发送用send函数来完成,当数据传输完毕,双方都调用close函数关闭各自套接字,终止通信。
int recv(int s,void * buf,int len,unsigned int flags);
2.2 线程池技术
线程池的作用是有效的降低频繁创建销毁线程所带来的额外开销。项目中,在服务器启动之初便预先创建一定数目的任务线程。在运行的过程中,需要时可以从这些线程所组成的线程池里申请分配一个空闲的线程,来执行认证的任务,任务完成后,并不是将线程销毁,而是将它返还给线程池。如果线程池中预先分配的线程已经全部分配完毕,但此时又有新的任务请求,则线程池会动态的创建新的线程去适应这个请求。其工作流程图见图3。
任务线程是在线程池结构体变量初始化时启动的线程。任务线程池中的任务线程如果检测到任务链表中的任务节点数不为零就从任务链表尾(T)取出任务节点并执行相应的任务,同时让任务链表中的任务节点数减1.如果任务链表中的任务节点为零,就使任务线程挂起,等待主线程向任务链表中抛入一个任务后,再次唤醒空闲的任务线程执行任务。
2.3 对称加密(DES算法)
基于“对称密钥”的加密算法主要有DES、TripleDES、RC2、RC4、RC5和Blowfish等。DES算法把64位的明文输入块变为数据长度为64位的密文输出块,其中8位为奇偶校验,另外56位作为密码的长度。首先,DES把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,并进行前后置换,最终由L0输出左32位,R0输出右32位,根据这个法则经过16次迭代运算后,得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出,图4为算法流程。
3 系统运行及测试
3.1 运行环境
操作系统:Ubuntu Linux(10.10版本),Linux(内核2.6版本)数据库:MySQL
编译环境:g++,openssl 库函数,ROOT权限
3.2 系统集成测试
登录测试,配置好服务器及服务器端数据库,为了验证认证服务器的加密解密算法的正确性,设计了一个正常的客户端程序。该程序首先生成DES密钥,然后向服务器发送认证请求,在接收到服务器的公钥后,用公钥加密自己的用户ID号、口令和DES密钥发送给服务器。测试的目的是查看服务器能否正确解密客户端信息并进行验证。
系统压力测试,测试用例1是客户端先发送错误的UID号(此次测试UID=1234)进行死循环访问服务器,压力测试的屏幕截图如图5所示。从图中我们可以看到,因为UID错误,所以结果只显示 connect success,然后直接提示uid error,再关闭SOCKET,接着循环继续运行,所以效果则是刷屏一样的不停的显示, 但是不会因为压力太大而断开。服务器承受错误的业务运行稳定。
测试用例2是在客户端先发送正确的UID号(此次测试UID=12345)与密码(mima=123456789)进行不间断的死循环访问服务器测试5分钟。从‘运行结果和‘运行日志文件两个地方进行分析推论出
一秒钟运行超过300次,所以相当于对服务器访问了300次,所以说服务器1秒钟能承受3000次以上正确的UID与mima验证的访问压力。5分钟的访问压力也不会让服务器承受不了压力而断开或出错,因此服务器承受正确的业务逻辑稳定。
4 结束语
论述了高并发认证服务器的创作思路和整个项目总体设计,采用了RSA和DES算法来保证信息传输的安全性,采用epoll和线程池技术来保证其具有高并发功能,通过测试,认证服务器在高负载的情况下运转正常。该系统作为在短时间内同时处理大量的来自客户端请求的研究具有很强的现实意义。
参考文献:
[1] 车永刚, 柳佳,王正华,等.超级计算机体系结构及应用情况[J]. 计算机工程与科学, 2003, 25(6): 97-100.
[2] 杨树军, 戴水诵. 超大规模下集群监控管理系统的设计与实现[J]. 高性能计算发展与应用, 2010(2): 1-4.
[3] Hoffman F, Cluster Monitoring with Ganglia. Linux Magazine[J]. 2003, 5(7): 46-51.