加密通讯聊天平台的设计与实现以 WEB 平台为例.docx
《加密通讯聊天平台的设计与实现以 WEB 平台为例.docx》由会员分享,可在线阅读,更多相关《加密通讯聊天平台的设计与实现以 WEB 平台为例.docx(47页珍藏版)》请在冰豆网上搜索。
加密通讯聊天平台的设计与实现以WEB平台为例
摘要
21世纪是信息时代,随着计算机技术、多媒体技术和互联网技术的飞速发展,我们足不出户就能够联系到处于世界另一个角落的朋友,获取世界各地的信息。
IM(InstantMessaging,即时通讯)应用已经成为人们交流沟通必备的工具。
为国人熟知的就有QQ、weChat等。
QQ和weChat等IM软件发展到今天,已经具备完善的通讯功能,简单易用且随时随地。
但一些特定行业单位,比如国安部门、军队单位、军品研究生产单位或者有商业机密和研发机密的需求的一些公司,出于其安全性和保密性的要求,其办公网络是与Internet完全物理隔离的。
那么为这些特定企业设计和开发即时通讯系统就显得非常重要和必要。
本次毕业设计的加密通讯聊天平台,以AES加密算法和RSA加密算法相结合实现信息加密,论文具体介绍整个系统的设计与实现过程,使用Layer、BootstrapJQuery开发前端界面,SpringBoot搭建后端框架。
关键词:
SpringBoot;Shiro;WebSocket;AES加密;RSA加密
Abstract
The21stcenturyistheinformationage.Withtherapiddevelopmentofcomputertechnology,multimediatechnologyandInternettechnology,wecanreachfriendsinanothercorneroftheworldandgetinformationfromallovertheworldwithoutleavinghome.IM(InstantMessaging,instantmessaging)applicationhasbecomeanessentialtoolforpeopletocommunicate.
QQandweChatarewell-knowntothepeople.WiththedevelopmentofIMsoftwaresuchasQQandweChattothisday,italreadyhasacompletecommunicationfunction,whichissimpleandeasytouse,anytime,anywhere.However,somespecificindustryunits,suchasnationalsecuritydepartments,militaryunits,militaryproductresearchandproductionunits,orsomecompanieswiththeneedsofcommercialsecretsandresearchanddevelopmentsecrets,becauseoftheirsecurityandconfidentialityrequirements,theirofficenetworkiscompletelyphysicallyisolatedfromtheInternetof.Soitisveryimportantandnecessarytodesignanddevelopinstantmessagingsystemsforthesespecificenterprises.
ThegraduatedencryptedcommunicationchatplatformusesAESencryptionalgorithmandRSAencryptionalgorithmtoachieveinformationencryption.Thethesisspecificallyintroducesthedesignandimplementationprocessoftheentiresystem,usesLayerandBootstrapJQuerytodevelopthefront-endinterface,andSpringBootbuildstheback-endframework.
Keywords:
SpringBoot;Shiro;WebSocket;AES;RSA
第一章绪论
1.1研究背景和意义
1946年2月14日,世界上第一台通用计算机“ENIAC”在宾夕法尼亚大学被发明出世。
1969年6月,世界上第一个采用分组交换技术组件的网络诞生,即“阿帕网”,后又发展为今天的互联网。
随着计算机技术、多媒体技术和互联网技术的快速发展,改变了人与人之间从古时的车马邮件,飞鸽传书的通讯方式,人们之间的沟通方式更加多元。
IM(InstantMessaging,即时通讯)因应而生并飞速发展。
IM系统允许用户可以随时使用网络实地通信,即时性是其最大的优点,只要双方同时在线,即可实现交流通讯。
众所周知,18至19世纪是蒸汽时,一切发展的动力源于蒸汽;19至20世纪是电气时代,电的发现以及电机等以电驱动的各类设备的发明与使用,推动着整个世界的生产迈向自动化,机械化。
20至21世纪无疑就是信息时代,随着计算机技术、多媒体技术和互联网技术的飞速发展,我们足不出户就能够联系到处于世界另一个角落的朋友,获取世界各地的信息。
IM系统已经成为人们交流沟通必备的工具。
第一个即时通讯工具是几个以色列青年在1996年11月发明的。
ICQ是英文ISEEKYOU我找你的谐音。
因为中国接入互联网年份较晚,所以ICQ并不为中国普通大众所熟知。
与ICQ有着异曲同工的QQ,则是家喻户晓的的IM产品,其优良的软件性能和免费特性,深受用户喜爱。
随后诞生的微信,亦长江后浪推前浪。
QQ和微信已是中国人民不可或缺的通讯工具。
QQ、微信、阿里旺旺等通讯软件都是基于用户安装客户端软件,即C/S架构而存在。
虽然之后推出了网页网版,但阉割了其大部分功能,要想有良好的用户体验,还是需要下载并安装其软件到电脑里或者手机里。
如果设备里没有安装软件,或者要联系的人没有安装软件,那么就就会有一个等待安装的限制,便利性受到约束。
而且没一次软件新功能的推出,都需要用户去升级软件,很大程度上并不能照顾到所有用户。
随着网页WEB技术的发展,更多的软件脱离了C/S架构模式,转为B/S架构。
而WebSocket的出现,也为IM系统设计成B/S架构提供了可能。
采用B/S架构的IM工具,用户就可以摆脱下载软件安装软件才能使用软件的桎梏,只要电脑里、手机里有可以访问网页的浏览器,即可以使用其进行通讯交流,不必考虑设备差异。
当下互联网WEB应用在市场的比重占有率逐步升高,且随着移动互联的发展,WEB应用的多终端兼容实现的优势也充分体现。
相较于传统C/S架构,B/S架构有以下优点:
轻量化开发、易维护更新、受众面广、简化用户使用流程、界面美观、良好的兼容性等。
1.2设计思路
虽说是加密聊天通讯工具,但其功能实现也不外乎是传统IM工具的所应具备的能力。
如基本聊天功能,用户登录与注册功能,文件传输功能等。
基于功能实现属性,我将分为以下几个模块:
用户注册/登录模块、私聊/群聊模块、日志模块、系统模块、公共文件模块、加密功能模块、好友模块、个人信息模块。
其中聊天模块主要实现P2P私人聊天和建群群聊功能,文件和图片传输功能。
该系统后端将基于SpringBoot框架开发,技术选型为:
Java,MyBatis,WebSocket,WebRTC等;前端页面设计基于Bootstrap4,Jquery,Layer等;数据库选用Mysql5.7;版本控制即打包使用Maven;加密功能模块暂定为AES加密和RSA加密双结合实现信息加密处理,具体过程为:
聊天信息为AES对称加密,但要对AES密钥用对方的RSA公钥加密。
双方在得到加密信息后,需要用自己的密钥解密被RSA加密过的AES密钥,并用这个AES密钥解密被AES加密的信息。
这样一来,传输的数据都是密文,且只有秘钥才能解密。
以此来达到更为安全的加密效果。
1.3论文整体结构
结构安排如下:
第一章:
绪论。
介绍本系统的研究背景和意义,简述系统内容和结构安排
第二章:
相关理论知识。
对系统开发中相关技术进行介绍,主要包括、SpringBoot、Maven、Shiro、Redis等
第三章:
关键技术研究,对系统关键技术WebSocket、AES加密技术、RSA加密技术进行叫详细说明
第四章:
对系统功能模块进行图例演示,阐述系统概要设计
第五章:
系统实现
第六章:
项目演示和总结
第七章:
文献综述
第二章相关理论知识
2.1开发环境和技术选型
♦操作系统:
Windows10操作系统;
♦数据库:
mysql-5.7;
♦Java环境:
JDK1.8;
♦浏览器:
MicrosoftEdgeBeta
♦开发工具:
IntelliJIDEA2019.2.3x64、Navicat12forMySQL
♦系统环境:
JavaEE8、Servlet3.0、ApacheMaven3
♦主框架:
SpringBoot2.0、SpringFramework5.0、ApacheShiro1.4
♦持久层:
ApacheMyBatis3.4、AlibabaDruid1.1
♦视图层Bootstrap4、Thymeleaf3.0
2.2SpringBoot
2.2.1SpringBoot简介
SpringBoot是一个java开发框架,它简化用Spring开发应用的时候,繁琐的搭建过程。
SpringBoot其实不是一个全新的产品,我们可以从它身上看到前辈SSH和SSM的影子。
它默认配置了很多框架的使用方式,例如Mybatis、Shiro等等,就像mave可以整合所有的jar包一样
2.2.2为什么使用SpringBoot
SpringBoot之前SSM框架或其他Spring框架,在整合其他功能框时都需要配置文件,这导致项目中的配置文件越来越多,内容越来越繁杂。
项目中常常因为配置文件出错的原因,导致项目运行出错。
SpringBoot的出现,解决开发框架的繁杂配置。
SpringBoot约定大于配置的理念,使它能快速整合第三方框架,减少甚至不需要配置文件。
对于一个开发团队来说,极大减少工作成本、更加利于开发,且后期维护也更加简单。
2.3ApacheShiro
2.3.1可靠的安全框架
ApacheShiro是一个Java安全框架,提供了认证、授权、加密和会话管理等功能,对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。
1)Authentication的身份认证/登录,验证某个已认证的用户是否拥有某个权限;
2)SessionManager:
会话管理,用户登录后在没有退出之前,它的所有信息都在会话中。
对Web开发十分友善;
3)Cryptography:
加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
4)Caching:
缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;
我的认知是:
Shiro是一套安全认证和权限管理框架,而不是一个取之能用的工具。
既然是框架,Shiro就不会去主动维护用户、维护权限;简而言之,架子人家给搭好了,而登录验证逻辑,权限赋予逻辑等等之类“里子”需要我们自己去填
2.3.2总结shiro的三板斧
一个完整的Shiro业务,必须包括Subject、SecurityManager、Realm,我称之为shiro的三板斧,打完即收工:
1)Subject:
主体,代表了当前“用户”;所有Subject都会绑定到SecurityManager,且与Subject的所有交互都会委托给SecurityManager;Subject更多只是一个门面作用;SecurityManager才是实际的执行者;
2)SecurityManager:
安全管理器;所有与安全有关的操作都会与SecurityManager交互;可以看出它是Shiro的核心;
3)Realm:
域,谁来负责和数据库进行交互呢?
Realm!
谁来给用户做身份认证和赋予权限呢?
Realm!
也就是说SecurityManager要做的操作,其实都是交于Realm的
2.4.3UsernamePasswordToken
实现过程中我们可能会碰到这个家伙,它用于将用户输入的用户名和密码封装成token;普通的登录无非就是输入账号密码。
可以通过调用getPrincipal()方法来获取token中的用户名并以此来进行登录验证;实质就是通过调用本地getUserName()方法直接获取存储在token中的username。
credentials:
证明/凭证,即只有主体知道的安全值,如密码/数字证书等;可以通过getCredentials()方法来获取token中的密码,该方法与获取用户名的方式一致,调用本地getPassword()方法获取存储在token中的密码由此可见UsernamePasswordToken的重要性;这个类同时继承了HostAuthenticationToken及RememberMeAuthenticationToken,因此UsernamePasswordToken能够存储客户端的主机地址以及确定token是否能够被后续的方法使用(即登录时的‘“记住我”’)。
出信息安全考虑,验证完成后通常会调用clear方法清除token数据,其中对用户密码(password)的处理较为特殊,UsernamePasswordToken不是单纯地:
“password=null”,而是先将password引用对应的char数组的值全部置0,然后断开调用。
2.4.4ShiroConfig配置类
shiro做什么?
怎么做?
很大一部分(甚至可以说完全)由shiroConfig约定而为。
简单点,shiroConfig就是shiro一个配置类,类似于以前的xml。
林林总总有个多配置,个人觉得以下几个配置在配置类中比较重要:
安全管理器SecurityManager、shiro拦截器、自定义Realm(后期要做第三方)、session管理器。
1)SecurityManager在前边讲过,作为shiro的核心,主要协调Shiro内部的各种安全组件。
我在使用过程中,接触到的主要是用来配置realm
2)shiro拦截器(shiroFilter)**可以用设置各个页面的访问权限,一般在为进过shiro认证之前,这里只会放行登录/注册操作页面,错误页面,登出页面和一些静态文件。
2.4.5Realm
Shiro的认证和授权操作,是由realm类来实现的;一般这个类是自己自定义的。
自定义的Realm类要继承AuthorizingRealm类,并且重载doGetAuthorizationInfo和doGetAuthenticationInfo两个方法。
第三章关键技术研究
3.1WebSocket
3.1.1WebSocket简介
WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层,和HTTP一样基于TCP传输。
但WebSocket是全双工传输形式,也就是说可以实现客户端和服务器之间双向交流,客户端实时了解服务器数据变化,这种形式特别适合用来做聊天程序。
WebSocket最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,这种情况下可以实现:
较少的控制开销、更强的实时性、保持连接状态、数据格式比较轻量,性能开销小,通信高效。
建立在TCP协议之上,服务器端的实现比较容易。
3.1.2系统WebSocket事务图
3.1.3WebSocket工作原理
1)WEB服务端开启WebSocket服务并等待客户端用户连接。
2)浏览器创建WebSocket类对象并向服务端请求连接。
3)WEB服务器触发WebSocketService的createWebSocketInbound方法并接受数据,创建对应onOpen方法。
4)WEB服务器判断连接是否创建成功,如失败执行步骤5,成功执行步骤6
5)连接创建失败,触发客户端error回调函数,结束WebSocket连接
6)连接创建成功,触发客户端onopen回调函数,完成WebSocket连接
7)客户端通过send方法发送数据到WEB服务器
8)WEB服务器触发onMessage方法接受客户端数据
9)WEB服务器通过sendMessage方法像客户端发送数据
10)客户端触发onMessage回调函数接收数据并进行相关操作
11)客户端通过调用close方法关闭WebSocket连接
12)服务器触发onClose方法进行关闭连接操作,结束WebSocket连接
3.2加密算法
3.2.1AES加密
AES是最流行的对称加密算法,对信息的加密和解密用的是同一套密钥。
加密之初会把文件切分成一个个128位,的小块进行加密。
如果文件大小不是16字节的整数倍,那就要在末尾添加一些数据凑够。
AES有两个输入一个输出,输出是密文,输入自然是密钥和明文。
输出是明文,输入自然就是密钥和密文。
当然具体的加解密过程十分复杂。
AES是非常安全的,最短的密钥也会有128位,大部分密钥长度会比128位大。
密钥越长也就越安全,但随之加解密的速度就越慢。
。
AES加密非常常用,很多CPU在硬件层面上都会支持AES的加解密,https就是使用AES来进行数据的加密的,因为AES是TLS和SSL标准的一部分。
3.2.2RSA加密
对称加密和非对称加密是密不可分的。
AES是对称加密,而RSA则是非对称加密算法。
如果没有RSA算法,现在的网络世界可以说毫无安全可言。
ssh协议也是基于RSA加密算法才能确保通讯是加密的,可靠的。
非对称加密算法的加密解密过程是这样的:
1)用户A使用RSA算法生成两把密钥,就是公钥和私钥。
顾名思义,公钥就是公开的,私钥就是自己保存的。
2)用户B想对用户A发送加密信息,用户B可以轻松获取到用户A的公钥,然后用它对信息加密。
3)用户A得到加密后的信息,用自己的私钥解密。
这样每个人都可以利用公钥发送加密消息,而只有拥有秘钥的接收方才能解读密文看到原消息。
第四章系统功能需求
我将系统总体功能分为以下几个模块:
用户登录/注册、用户信息更改、头像文件上传、在线多人群聊、在线私聊、系统日志记录、聊天内容加密传输。
4.1注册/登录模块
4.1.1用户注册
用户注册抛弃传统的用户自由定义帐号密码进行注册,改为现流行的手机号注册新用户,即用户通过手机号接收短信验证码实现注册,因为手机号注册均为个人实名注册,这就保证了帐号的唯一性和真实性。
方便用户维护和管理;具体流程为下图:
4.1.2用户登录
1)短信登录:
因为用户注册的时候用的是手机号,用户在注册成功后,可以通过手机号接收登录验证码进行登录。
2)帐号密码登录:
用户在注册时设置的密码,即用户的登录密码,用户可以通过手机号加登录密码进行登录。
3)第三方登录:
用户可以给帐号绑定第三方帐号,实现第三方帐号登录
4.1.3微信第三方登录
第三方登录我选用应用较为广泛的微信扫码登录。
即帐号可以和用户自己的微信帐号进行绑定,实现微信扫码登录本IM系统。
在这个项目中,微信第三方登录的关键点,即用户的系统账号和微信号的绑定。
总体可以分为一下三个步骤:
对于系统账户与微信的绑定,我的思路是:
若是没有绑定过微信的用户扫码登录,即提示其先账号密码登录,系统自动更新Auth表信息;若未未注册用户,则提示其注册,注册时自动更新第三方登录表信息。
但扫码登录只是登录的一种,更多的时候用户只是执行简单的登录或者注册;所以我引入了redis服务。
当一个用户是先扫码再登录/注册的,我会在redis保存其openId和unionId信息,执行登录/注册操作时,先去redis取值,如果存在openId和unionId,说明用户此时是在执行绑定微信操作,绑定微信操作完成后清除redis中的openId和unionId信息。
这样就可以很简单的区分用户是在进行普通的登录注册或者绑定微信的登录注册了。
怎么确保每一个扫码绑定微信的用户,能从redis拿到属于自己的openId和unionId呢?
可以用第一步请求到的code,开放平台给的微信授权临时票据。
结合code作为对应的openId和unionI在redis的key,可以确保每一个用户拿到对应的唯一的openId和unionId。
4.2通信模块
在线多人群聊、在线私聊的实现相对简单,在WebSocket连接成功的情况下,WebSocket基本可以完成以上功能。
用户的聊天记录信息都会在加密后实时保存在Redis服务器中,当用户退出系统后,系统将会获取Redis中的聊天信息,保存到数据库中。
用户下次登录,服务器将从数据库获取对应的加密聊天记录,解密后回显指用户界面。
具体流程图如下
4.3加密模块
加密功能模块暂定为AES加密和RSA加密双结合实现信息加密处理,即其登录信息和聊天信息为AES对称加密,但要对其解密密钥实现RSA加密传输,即客户端和服务器通过RSA算法各自生成一套公钥和私钥,并交换公钥。
信息被AES算法加密,AES的key被RSA算法加密。
双方在得到加密信息后,需要用对方的公钥解密被RSA加密过的key,并用这个key解密被AES加密的信息。
这样一来,传输的数据都是密文,且只有秘钥才能解密。
以此来达到更为安全的加密效果。
第五章系统具体实现
5.1系统架构设计
系统采用经典的B/S架构体系,即三层架构体系。
分别为表现层(UI)、业务逻辑层(BBL)和数据访问层(DAL)。
而项目的设计模式也是较为传统实用的MVC模式,即Model(模型),View(视图),Controller(控制)。
1)表现层:
主要负责展示系统业务和数据,实例化用户的业务操作;较为通俗的说法即前端页面展示。
我将使用HTML5、Jquery、Bootstrap和Thymeleaf实现。
2)业务逻辑层:
作为连接前端和数据库数据的中间媒介,业务逻辑层极为重要,它将表现层,即前端用户的操作行为和数据请求进行处理,与数据库做数据交互,将处理结果返回表现层。
起着中间枢纽的重要作用。
MVC设计模式也在该层有极大的体现
3)数据访问层:
原始数据的操作层,对原始数据进行操作,具体的功能是为表现层以及业务逻辑层提供需要得数据服务。
5.2系统功能设计
5.3数据库设计
5.3.1数据库E-R图
用户与系统日志
用户与用户日志
用户和在线用户表
5.3.2数据库表设计
表1用户表
用户表(Employee)
字段名
意义
数据类型
宽度
是否可为空
主键
id
用户id
varchar
64
否
√
login_name
登录账户
varchar
100
否
nick_name
用户昵称
varchar
100
是
salt
盐
varchar
1