APP下载

基于JAVA的简单Socket通信

2020-08-04孙炳润马刚

科学导报·学术 2020年35期
关键词:数字签名

孙炳润 马刚

摘  要:随着信息技术的飞速发展,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

猜你喜欢

数字签名
中国电子签名立法与实践问题研究
交通运输行业数字签名系统的设计与实现分析
关于电子商务中安全数字签名的研究
基于XML的数字签名在电子病历的应用方法
手动查安全 揪出“不明身份”者
掌握方法用好数字签名