Qt实现客户端/服务器端登录验证|数据传输使用md5加密

来源:互联网 发布:零基础美工基础知识 编辑:程序博客网 时间:2024/05/17 09:28

 

      要完成两个模块:客户端和服务器端。即实现通过客户端向远程服务器段发送数据来验证,以此来实现简单的认证功能。同时,客户端在向服务器段发送的数据通过md5加密后再传送。

 

开发环境与工具

       开发操作系统:   Windows 8 Enterprise 32位

       开发平台:          基于Qt5.0.1框架

       集成开发工具:   QtCreater 2.6.2

       选用数据库:      mysql-6.0.11-alpha-win32免安装版

 

数据库设计

       由于本次实验仅仅实现一个简单的用户登录验证的功能,仅仅使用到一个简单的用户数据表。故数据库建立的SQL语句如下:

 

      创建数据库:       CREATE DATABASE liyangDEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;       创建用户ly_user表:    CREATE TABLE ly_user(id INT PRIMARY KEYAUTO_INCREMENT, passwd VARCHAR(50) NOTNULL, email VARCHAR(50) NOTNULL) DEFAULT CHARSET UTF8;插入默认用户:INSERT INTO ly_user VALUES(NULL,”2010012840”,”solome@outlook.com”);       注意:登录验证采用email/passwd的方式,不必要用户名等其它冗余数据。

       数据库的实现如图1所示。

1 数据库操作实现

 

服务器端的实现

首先,自己实现一个简单的服务器,来捕获通过客户端发送来的QTcpSocket数据包。由于采用TCP协议实现的C/S应用程序,在服务器端主要使用到QTcpSocket和QTcpServer两个核心类。

由于TCP是端对端之间的网络数据连接,通过IP地址和相应的端口号的来实现进程间的连接,防止其他应用程序占用端口号,这里在服务器端实现端口号(port)的自定义。因为,客户端连接服务器段,必须要知道服务器当前所占用的端口号(port)。

服务器控制台界面的设计如图2所示。

2 服务器端控制台设计

       由于数据包是以md5密文传送的,当数据传送到服务器段时不可能会得到解密之后的明文。那该如何读取数据库信息进行验证呢?我采取的措施是将数据库信息遍历的同时,也进行md5加密,进行密文间的比较验证。这有个好处是不会出现sql注入等类似的攻击;缺点也很明显,因为要遍历数据库进行查询操作,但数据库容量很大时会浪费大量的时间。

       使用Qt技术框架进行MySQL数据库操作时,还遭遇到了没有MySQL驱动的问题,解决方案是自己下载MySQL和Qt 5.0.1源代码重新编译。虽然可以直接使用MySQL提供的函数接口,但这样实现起来没有Qt自带封装后的类库使用方便,这样也使服务器端的实现显得不臃肿。

 

客户端登录实现

比服务器端,客户端实现就显得很容易了。最终实现的客户端登录界面如图3所示。

3 客户端用户登录

4 登录验证成功

5 登录验证失败

 

在客户端就直接使用QTcpSocket连接远程服务器,MD5加密操作直接使用Qt框架中QCryptographicHash类,直接使用QCryptographicHash(QCryptographicHash::Md5);即可实现MD5加密的操作(在服务器端同样如此)。登录验证成功和失败均弹出一个对话框给予结果提示,分别如图45所示。

这个是支持多个客户端同时验证。并非一对一的连接传输,而是多对一的连接传输。可以打开多个客户端进行登录验证操作。

 

关于源代码的使用

       仅仅安装Qt环境是不够的,必要的操作如下:源代码下载地址:http://www.oschina.net/code/snippet_126633_21269

       ①安装完整版的MySQL数据库,并且将安装目录/bin/下的libmysql.dll文件拷贝到System32目录下;

       ②Qt 5.0.1默认没有安装MySQL操作相关的驱动程序,将无法使用QSqlDatabase等相关MySQL数据库操作类;请将提供的qsqlmysql.dll和qsqlmysqld.dll动态链接库复制到Qt的安装目录\5.0.1\mingw47_32\plugins\sqldrivers。

       ③由于涉及到网路编程,在客户端和服务器端程序.pro文件中添加network字段,服务器端.pro文件还要加sql字段,如QT+=coreguinetwork。