孙炳润 马刚
摘 要:随着信息技术的飞速发展,Socket的数据传输安全技术成为近几年的热点研究问题,为了实现网络数据传输安全技术的功能,必须充分利用Socket通信的自身优势,并结合Java语言的安全性特点来完成。本文分析了Java平台下Socket数据传输安全的特点,研究了三种基于Socket数据传输安全技术。希望给后续研究提供一定的参考
关键词:JAVA;传输安全;对象序列化;数字签名;SSL
一、JAVASOCKET网络通信编程的实现过程
1.1建立服务器端
(1)调用ServerSocket类,以某个端口号为参数创建一个ServerSocket实例,即是服务器端的服务程序在监听该指定端口的Socket。
(2)创建ServerSocket并保持监听状态,调用了ServerSocket對象的accept()方法,随后接收来自客户发送的Socket连接请求。在服务器程序监听Socket连接请求时,也可采用Java的多线程技术,实现并发服务器连续监听连接请求。
(3)调用Socket对象的getInputStream和getOutputStream方法建立输入流和输出流,并进行封装。不过在调用这两个方法时可能会产生I/O异常,必须要去捕获这个I/O异常。
(4)使用建立好的输入输出流对象的read和write方法完成和客户端的数据传输,并把处理结果返回给客户端。
(5)在服务器与客户机双方通讯结束以后,服务器端应该及时关闭输入和输出这两个数据流。
1.2建立客户端
(1)以服务器指定的IP地址或主机名以及服务器指定的端口号为参数,调用Socket类的构造方法,创建一个Socket对象。
(2)建立了客户端通信的Socket后,就可以像服务器一样使用Socket的getInputStream和getOutputStream方法来创建输入流和输出流。
(3)调用输入流和输出流对象相应的方法读写字节流或字符流数据,完成双方的通信任务。
(4)在客户机与服务器双方通讯结束以后,我们也要用字节流或字符流对象的close()方法来关闭用于网络通信的输入流和输出流,再用Socket对象的close()方法来关闭Socket。
二、基于SOCKET数据传输的安全技术分析
2.1基于Socket的对象序列化的安全技术分析
(1)对象序列化的安全技术分析
对象一旦被序列化后,作为对象序列化结果的字节流可以读取,也可以被任何能访问该流的对象改变,这就允许任何对象访问序列化对象的状态,因而违背了用户所期望的隐私权。同时,用户也可以任何方式改变流中的字节,并允许重新构造Java平台下保护范围内从未创建的对象。
2.2基于SOCKET的数字签名的安全技术分析
数字签名的技术主要有DSA和RSA算法两种,而DSA比RSA产生密钥速度快,但它们的安全性差不多。其主要包括三个过程:一是生成公钥和私钥,其中公钥可以对外公开,私钥用于加密;二是签名文件内容,即将生成的密钥对写入或保存到文件中;三是发送签名后的数据及公钥,拿公钥来检验数据文件中的数字签名。
2.3基于SOCKET的SSL的安全技术分析
(1)安全套接层协议
a.客户端向服务器端发起通信对话,协商传送加密算法,准备进行安全的对话,并告之所用的对称加密算法、密钥交换算法、摘要算法等。
b.服务器收到请求后向客户端发送服务器数字证书,并确定使用一种加密组合进行通信,为了证明确实是服务器端,必须发送服务器端的数字证书给客户端,并且让客户端验证服务器端的身份。
c.客户端再向服务器端传送本次对话的密钥,检查服务器端的数字证书是否正确,通过证书验证了服务器端证书的真实有效性后,利用服务器端的公钥生成本次对话的密钥发送给服务器端,并告之服务器端。
d.服务器端向客户端获取密钥,并用自己的私钥解密获取本次通讯的密钥,并告之客户端已经获取了密钥可以开始通信了。
e.服务器端与客户端进行通讯。
(2)安全套接层协议
一般的SSL套接字有许多默认选项,如果想修改其中的某些选项,就要用到SSLContext类的对象来实现。
三、基于Socket数据传输安全方案的研究
3.1基于Socket的对象序列化安全方案
(1)将要保密的数据标记为transient属性
如将某一对象中password字段保护起来,可以对该字段属性设置为PrivatetransientStringpassword;当对象在序列化发生时,Java虚拟机将被声明为transient的所有域。
(2)实现Externalizable接口
Externalizable接口属于Serializable接口的子类。但是如果采用这种Externalizable接口的方法,必须就要声明writeExternal()和readExternal()两个函数。将不需要被序列化的字段提取出来放到父类中去,让子类实现Serializable接口,这样的话父类相应的字段数据就可以不被序列化。
3.2基于Socket的数字签名安全方案
(1)开发签名的数据对象
首先需要有一个待签名的对象,而这个对象在进行序列化时,对象中只出现公钥。
(2)开发客户端
客户端需要实现读取文件内容,使用安全API接口来产生一对密钥(包含公有和私有)、签名文件内容,并且通过网络来发送加密后的对象给服务器,相关类和方法及步骤如下:
a.使用KeyPairGenerator类来产生公共及私有密钥。
b.使用KeyPairGenerator类的initialize()方法来完成初始化密钥对。
c.获得密钥。
d.获取一个签名的对象。e.初始化签名对象。
e.把需要签名的数据提供给签名对象,将需要签名的数据读到一个字节数组,然后再通过调用Signature类的update方法,再把数组提供给签名对象。
f.产生签名,然后通过网络发送。
(3)开发服务器端
a.创建Signature类的一个实例。
b.用公有密钥初始化对象。
c.使用update()方法提供签名的数据来给需要验证的签名。
3.3基于Socket的SSL安全方案
SSL协议可分为两层:第一层是SSL记录协议,它是建立在可靠的传输层协议之上,为应用层协议提供数据压缩、封装、加密等基本功能;第二层是SSL握手协议,它是建立在SSL记录协议之上,用在数据传输开始前,通信双方身份认证、交换加密密钥、协商加密算法等初始化协商功能。基于Socket的采用SSL协议的传输安全方案需要用到一个Java数据证书的管理工具Keytool。Keytool将密钥(key)和证书(certificates)保存在一个称为keystore的文件当中,每个keystore都关联着这一个独一无二的公钥。
四、结束语
网络数据传输安全已成为网络应用发展的一个瓶颈。本文分析研究了网络数据基于JavaSocket的传输安全问题,对基于JavaSocket的网络数据传输安全的三种技术进行了深入研究和探讨,提出了三种基于JavaSocket网络数据传输的安全的技术方案。
参考文献
[1] 耿祥义.Java2实用教程[M].北京:清华大学出版社,2013.
[2] 王一飞.Java网络程序设计[M].北京:中国电力出版社,2010.
[3] 姚凯,刘琳琳.基于Java多线程技术的网络编程研究[J].电子技术与软件工程,2017,8:12