Java网络编程——安全网络通信

在网络上,信息在由源主机到目标主机的传输过程中会经过其他计算机。在一般情况下,中间的计算机不会监听路过的信息。但在使用网上银行或者进行信用卡交易时,网络上的信息有可能被非法分子监听,从而导致个人隐私的泄露。由于Internet和Intranet体系结构存在一些安全漏洞,总有某些人能够截获并替换用户发出的原始信息。随着电子商务的不断发展,人们对信息安全的要求越来越高,于是Netscape公司提出了SSL协议,旨在达到在开放网络(Internet)上安全保密地传输信息的目的。

Java安全套接字扩展(Java Secure Socket Extension,JSSE)为基于SSL和TLS协议的Java网络应用程序提供了Java API以及参考实现。JSSE支持数据加密、服务器端身份验证、数据完整性以及可选的客户端身份验证。使用JSSE,能保证采用各种应用层协议(比如HTTP、Telnet和FTP等)的客户程序与服务器程序安全地交换数据。

JSSE封装了底层复杂的安全通信细节,使得开发人员能方便地利用它来开发安全的网络应用程序。

1、SSL简介

SSL(Secure Socket Layer,安全套接字层)是一种保证网络上的两个节点进行安全通信的协议。IETF(Internet Engineering Task Force)国际组织对SSL作了标准化,制定了RFC2246规范,并将其称为传输层安全(Transport Layer Security,TLS)。从技术上,目前的TLS1.0与SSL3.0的差别非常微小。

如下表所示:
在这里插入图片描述

SSL和TLS都建立在TCP/IP的基础上,一些应用层协议,如HTTP和IMAP,都可以采用SSL来保证安全通信。建立在SSL协议上的HTTP被称为HTTPS协议。HTTP使用的默认端口为80,而HTTPS使用的默认端口为443。

用户在网上商店购物,当他输入信用卡信息,进行网上支付交易时,存在以下不安全因素:

  • 用户的信用卡信息在网络上传输时有可能被他人截获。
  • 用户发送的信息在网络上传输时可能被非法篡改,数据完整性被破坏。
  • 用户正在访问的Web站点有可能是个非法站点,专门从事网上欺诈活动,比如骗取客户的资金。

SSL采用加密技术来实现安全通信,保证通信数据的保密性和完整性,并且保证通信双方可以验证对方的身份。

1.1、加密通信

当客户与服务器进行通信时,通信数据有可能被网络上的其他计算机非法监听,SSL使用加密技术实现会话双方信息的安全传递。加密技术的基本原理是:数据从一端发送到另一端时,发送者先对数据加密,然后把它发送给接收者。这样,在网络上传输的是经过加密的数据。如果有人在网络上非法截获了这批数据,由于没有解密的密钥,就无法获得真正的原始数据。接收者接收到加密的数据后,先对数据解密,然后处理。下图显示了采用SSL的通信过程。客户和服务器的加密通信需要在两端进行处理。
在这里插入图片描述

1.2、安全证书

除了对数据加密通信,SSL还采用了身份认证机制,确保通信双方都可以验证对方的真实身份。它和现时生活中我们使用身份证来证明自己的身份很相似。比如你到银行去取钱,你自称自己是张三,如何让对方相信你的身份呢?最有效的办法就是出示身份证。每人都拥有唯一的身份证,这个身份证上记录了你的真实信息。身份证由国家权威机构颁发,不允许伪造。在身份证不能被别人假冒复制的前提下,只要你出示身份证,就可以证明你自己的身份。

个人可以通过身份证来证明自己的身份,对于一个单位,比如商场,可以通过营业执照来证明身份。营业执照也由国家权威机构颁发,不允许伪造,它保证了营业执照的可信性。

SSL通过安全证书来证明客户或服务器的身份。当客户通过安全的连接和服务器通信时,服务器会先向客户出示它的安全证书,这个证书声明该服务器是安全的,而且的确是这个服务器。每一个证书在全世界范围内都是唯一的,其他非法服务器无法假冒原始服务器的身份。可以把安全证书比作“电子身份证”。

对于单个客户来说,到公认的权威机构去获取安全证书是一件麻烦的事。为了扩大客户群并且便于客户的访问,许多服务器不要求客户出示安全证书。在某些情况下,服务器也会要求客户出示安全证书,以便核实该客户的身份,这主要是在B2B(Business to Business)事务中。

获取安全证书有两种方式,一种方式是从权威机构获得证书,还有一种方式是创建自我签名证书。

1.从权威机构获得证书

安全证书可以有效地保证通信双方的身份的可信性。安全证书采用加密技术制作而成,他人几乎无法伪造。安全证书由国际权威的证书机构(Certificate Authority,CA)如GlobalSign和WoSign颁发,它们保证了证书的可信性。申请安全证书时,必须支付一定的费用。一个安全证书只对一个IP地址有效,如果用户的系统环境中有多个IP地址,就必须为每个IP地址都购买安全证书。

2.创建自我签名证书

在某些场合,通信双方只关心数据在网络上可以被安全传输,并不需要对方进行身份验证,在这种情况下,可以创建自我签名(self-assign)的证书,比如通过JDK提供的keytool工具就可以创建这样的证书。这样的证书就像用户自己制作的名片,缺乏权威性,达不到身份认证的目的。当你向对方递交名片时,名片上声称你是某个大公司的老总,信不信只能由对方自己去判断。

既然自我签名证书不能有效地证明自己的身份,那么有何意义呢?在技术上,无论是从权威机构获得的证书,还是自己制作的证书,采用的加密技术都是一样的,使用这些证书,都可以实现安全地加密通信。

1.3、SSL握手

安全证书既包含了用于加密数据的密钥,又包含了用于证实身份的数字签名。安全证书采用公钥加密技术。公钥加密指使用一对非对称的密钥进行加密或解密。每一对密钥由公钥和私钥组成。公钥被广泛发布。私钥是隐密的,不公开。用公钥加密的数据只能够被私钥解密。反过来,使用私钥加密的数据只能被公钥解密。这个非对称的特性使得公钥加密很有用。

在安全证书中包含了这一对非对称的密钥。只有安全证书的所有者才知道私钥。如下图所示:
在这里插入图片描述
安全证书中的数字签名部分则是通信方A的电子身份证。数字签名告诉通信方B该信息确实由通信方A发出,不是伪造的,也没有被篡改。

客户与服务器通信时,首先要进行SSL握手,SSL握手主要完成以下任务:

  • 协商使用的加密套件。加密套件中包括一组加密参数,这些参数指定了加密算法和密钥的长度等信息。
  • 验证对方的身份。此操作是可选的。
  • 确定使用的加密算法。

SSL握手过程采用非对称加密方法传递数据,由此来建立一个安全的会话。SSL握手完成后,通信双方将采用对称加密方法传递实际的应用数据。所谓对称加密,指通信双方使用同样的密钥来加密数据:

以下是SSL握手的具体流程:

  • (1)客户将自己的SSL版本号、加密参数、与会话有关的数据以及其他一些必要信息发送到服务器。
  • (2)服务器将自己的SSL版本号、加密参数、与会话有关的数据以及其他一些必要信息发送给客户,同时发送给客户的还有服务器的证书。如果服务器需要验证客户身份,那么服务器还会发出要求客户提供安全证书的请求。
  • (3)客户端验证服务器证书,如果验证失败,就提示不能建立SSL连接。如果成功,就继续下一步骤。
  • (4)客户端为本次会话生成预备主密码(pre-master secret),并将其用服务器公钥加密后发送给服务器。
  • (5)如果服务器要求验证客户身份,那么客户端还要再对另外一些数据签名后,将其与客户端证书一起发送给服务器。
  • (6)如果服务器要求验证客户身份,则检查签署客户证书的CA是否可信。如果不在信任列表中,则结束本次会话。如果检查通过,那么服务器用自己的私钥解密收到的预备主密码,并用它通过某些算法生成本次会话的主密码(master secret)。
  • (7)客户端与服务器均使用此主密码生成本次会话的会话密钥(对称密钥)。在双方SSL握手结束后传递任何消息均使用此会话密钥。这样做的主要原因是对称加密比非对称加密的运算量低一个数量级以上,能够显著提高双方会话时的运算速度。
  • (8)客户端通知服务器此后发送的消息都使用这个会话密钥进行加密,并通知服务器客户端已经完成本次SSL握手。
  • (9)服务器通知客户端此后发送的消息都使用这个会话密钥进行加密,并通知客户端服务器已经完成本次SSL握手。
  • (10)本次握手过程结束,会话已经建立。在接下来的会话过程中,双方使用同一个会话密钥分别对发送以及接收的信息进行加密和解密。

1.4、创建自我签名的安全证书

获得安全证书有两种方式:一种方式是到权威机构购买,还有一种方式是创建自我签名的证书,本节将介绍后一种方式。

JDK提供了制作证书的工具keytool。在JDK1.4以上版本中包含了这一工具,它的位置为:<JDK根目录>\bin\keytool.exe

keytool工具提出了密钥库的概念。密钥库中可以包含多个条目。每个条目包括一个自我签名的安全证书以及一对非对称密钥。

通过keytool工具创建密钥库的命令为:
在这里插入图片描述
以上命令将生成一个密钥库,这个密钥库中有一个条目。这个命令中的参数的意思如下:

  • -genkeypair:生成一对非对称密钥。
  • -alias:指定条目以及密钥对的别名,该别名是公开的。
  • -keyalg:指定加密算法,本例中采用通用的RSA算法。
  • -keystore:设定密钥库文件的存放路径以及文件名字。

该命令的运行过程如下图所示:
在这里插入图片描述

首先会提示输入密钥库的密码(口令),假定输入“123456”,然后提示输入个人信息,如姓名、组织单位和所在城市等,只要输入真实信息即可。接着会提示输入信息是否正确,输入“y”表示信息正确。

以上命令将在操作系统的C:\chapter15目录下生成名为“test.keystore”的文件,它是一个密钥库文件,已经包含一个条目,这个条目的别名是“weiqin”,该条目具有一对非对称密钥和自我签名的安全证书。

以下命令在test.keystore密钥库中再加入一个名为“lulu”的条目:
在这里插入图片描述
以下命令查看test.keystore密钥库的信息,会列出所包含的条目的信息:
在这里插入图片描述
以上命令的输出结果如下:
在这里插入图片描述
从以上输出结果可以看出,test.keystore密钥库中包含两个条目,别名分别为“weiqin”和“lulu”。

以下命令把test.keystore密钥库中别名为“weiqin”的条目导出到一个安全证书文件中,文件名为weiqin.crt:
在这里插入图片描述
以上命令将在C:\chapter15目录下生成一个安全证书文件weiqin.crt。在weiqin.crt文件中包含了自我签名的安全证书,以及密钥对中的公钥,但不包含密钥对中的私钥。

以下命令删除test.keystore密钥库中的别名为“weiqin”的条目:
在这里插入图片描述
以下命令把weiqin.crt安全证书导入testTrust.keystore密钥库中,生成别名为“weiqin”的条目,这个条目中包含密钥对中的公钥,但不包含密钥对中的私钥:
在这里插入图片描述

2、JSSE简介

JSSE封装了底层复杂的安全通信细节,使得开发人员能方便地用它来开发安全的网络应用程序。JSSE主要包括4个包:

  • javax.net.ssl包:包括进行安全通信的类,比如SSLServerSocket和SSLSocket类。
  • javax.net包:包括安全套接字的工厂类,比如SSLServerSocketFactory和SSLSocket Factory类。
  • java.security.cert包:包括处理安全证书的类,如X509Certificate类。X.509是由国际电信联盟(ITU-T)制定的安全证书的标准。
  • com.sun.net.ssl包:包括Oracle公司提供的JSSE的实现类。

JSSE API允许采用第三方提供的实现,该实现可作为插件集成到JSSE中。这些插件必须支持Oracle公司指定的加密套件,在Oracle官网上指定了这些加密套件,以下是其中的部分内容:

  • SSL_DHE_DSS_EXPORT_WITH_DES_40_CBC_SHA
  • SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA
  • SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
  • SSL_DHE_RSA_EXPORT_WITH_DES_40_CBC_SHA
  • SSL_DH_ANON_EXPORT_WITH_DES40_CBC_SHA
  • SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA
  • SSL_RSA_EXPORT_WITH_DES40_CBC_SHA
  • SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA
  • TLS_DHE_DSS_WITH_AES_128_CBC_SHA
  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_DH_ANON_WITH_AES_128_CBC_SHA
  • TLS_DH_ANON_WITH_AES_256_CBC_SHA
  • TLS_DH_DSS_WITH_AES_128_CBC_SHA
  • SSL_CK_RC4_128_WITH_MD5

加密套件包括一组加密参数,这些参数指定了加密算法和密钥的长度等信息。以上列出的加密套件的名字包括4个部分:协议、密钥交换算法、加密算法和校验和。例如加密套件SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA表示采用SSL协议,密钥交换算法为DHE,加密算法为RSA。

JSSE具有以下重要特征:

  • 纯粹用Java语言编写。·可以出口到大多数国家。
  • 提供了支持SSL的JSSE API和JSSE实现。
  • 提供了支持TLS的JSSE API和JSSE实现。
  • 提供了用于创建安全连接的类,如SSLSocket、SSLServerSocket和SSLEngine。·支持加密通信。·支持客户端和服务器端的身份验证。
  • 支持SSL会话。·JSSE的具体实现会支持一些常用的加密算法,比如RSA(加密长度2048位)、RC4(密钥长度128位)和DH(密钥长度1024位)。

3、总结

Java安全套接字扩展(JSSE)为基于SSL和TLS协议的Java网络应用程序提供了Java API以及参考实现。JSSE支持数据加密、服务器端身份验证、数据完整性以及可选的客户端身份验证。使用JSSE,能保证采用各种应用层协议(比如HTTP、Telnet和FTP等)的客户程序与服务器程序安全地交换数据。

JSSE封装了底层复杂的安全通信细节,使得开发人员能方便地利用它来开发安全的网络应用程序。JSSE中负责安全通信的最核心的类是SSLServerSocket类与SSLSocket类,它们分别是ServerSocket与Socket类的子类。SSLSocket对象由SSLSocketFactory创建,此外,SSLServerSocket的accept()方法也会创建SSLSocket对象。SSLServerSocket对象由SSLServerSocketFactory创建。SSLSocketFactory和SSLServerSocketFactory对象都由SSLContext对象创建。SSLContext负责为SSLSocket和SSLSocketFactory设置安全参数,比如使用的安全协议、安全证书、KeyManager、TrustManager和安全随机数等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/234756.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—389.找不同【简单】

2023每日刷题&#xff08;五十五&#xff09; Leetcode—389.找不同 实现代码 char findTheDifference(char* s, char* t) {int len strlen(s);int len2 len 1;int a[26] {0};int b[26] {0};if(len 0) {return t[0];}for(int i 0; i < len; i) {int idx s[i] - a;…

neuq-acm预备队训练week 8 P1144 最短路计数

题目描述 给出一个 N 个顶点 M条边的无向无权图&#xff0c;顶点编号为 1∼N。问从顶点 1 开始&#xff0c;到其他每个点的最短路有几条。 题目限制 输入格式 第一行包含 22 个正整数 N,M&#xff0c;为图的顶点数与边数。 接下来 M 行&#xff0c;每行 2个正整数 x,y&…

101基于matlab的极限学习机ELM算法进行遥感图像分类

基于matlab的极限学习机ELM算法进行遥感图像分类&#xff0c;对所获取的遥感图片进行初步分类和最终分类。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。

键盘打字盲打练习系列之成为大师——5

一.欢迎来到我的酒馆 盲打&#xff0c;成为大师&#xff01; 目录 一.欢迎来到我的酒馆二.关于盲打你需要知道三.值得收藏的练习打字网站 二.关于盲打你需要知道 盲打系列教程&#xff0c;终于写到终章了。。。一开始在看网上视频&#xff0c;看到up主熟练的打字技巧&#xff…

【机器学习】041_模型开发迭代过程

一、模型开发的一般步骤 1. 明确研究问题 确定问题的组成和结果&#xff0c;明晰问题是分类问题还是回归问题 2. 决定系统总体架构 ①理解数据&#xff1a;采集&#xff08;爬取&#xff09;数据&#xff0c;生成&#xff08;导入&#xff09;数据&#xff0c;进行数据清洗…

Unity 实现单例模式

目录 基本概念 饿汉模式(推荐) 懒汉模式&#xff1a; 基本概念 单例模式&#xff1a;类只有一个实例&#xff0c;一般使用static来实现单例模式&#xff1b; 比如&#xff1a;有一个Test类,实现了单例&#xff0c;假设这个唯一的实例名为SingTonle,实例在类内被实现并被stat…

【KCC@南京】KCC南京“数字经济-开源行”活动回顾录

11月26日&#xff0c;由KCC南京、中科南京软件研究所、傲空间、PowerData联合主办的 KCC南京“数字经济-开源行” 的活动已圆满结束。此次活动&#xff0c;3 场主题研讨&#xff0c;11 场分享&#xff0c;现场参会人数 60&#xff0c;线上直播观看 3000&#xff0c;各地小伙伴从…

代码随想录刷题题Day9

刷题的第九天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C / Python Day9 任务 ● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值 1 有效的括号 代码随想录…

【设计模式--结构型--桥接模式】

设计模式--结构型--桥接模式 桥接&#xff08;Bridge&#xff09;模式定义结构案例好处使用场景 桥接&#xff08;Bridge&#xff09;模式 定义 将抽象与实现分离&#xff0c;使他们可以独立变化。它是用组合关系代替继承关系来实现&#xff0c;从而降低了抽象和实现这两个维…

轻量封装WebGPU渲染系统示例<46>- 材质组装管线(MaterialPipeline)灯光、阴影、雾以及多Pass(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/MaterialPipelineMultiPasses.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export class MaterialPipelin…

MySQL行锁范围分析(行锁、间隙锁、临键锁)

MySQL 中锁的概念 排它锁&#xff08;Exclusive Lock&#xff09; X 锁&#xff0c;也称为写锁&#xff0c;若事务T对对象A加上X锁&#xff0c;则只允许T读取和修改A&#xff0c;其他任何事物都不能再对A 加任何锁&#xff0c;直到T释放A上的锁。 SELECT…FOR UPDATE 对读取的…

公务员国考省考小白需知

文章目录&#xff1a; 一&#xff1a;分类 1.国考 2.省考 二&#xff1a;必备途径 1.相关网站 1.1 官网 1.1.1 必须知道的 1.1.2 比较好用的 1.1.3 事业单位的 1.2 机构 ​​1.3 时事 ​​1.4 资源 1.5 题库 1.6 真题 ​2.相关公主号 3.应用 4.群聊如何找 三…

Jenkins参数化构建及代码发布

如何使用gitlab--web端可以观看此篇教程 https://blog.csdn.net/m0_59933574/article/details/134528050?spm1001.2014.3001.5502https://blog.csdn.net/m0_59933574/article/details/134528050?spm1001.2014.3001.5502 整体思路 依赖环境及工具 Git Centos7及以上 Gitla…

【数据结构高阶】红黑树

目录 一、红黑树的概念 二、红黑树的性质 2.1 红黑树与AVL树的比较 三、红黑树的实现 3.1 红黑树节点的定义 3.2 数据的插入 3.2.1 红黑树的调整思路 3.2.1.1 cur为红&#xff0c;f为红&#xff0c;g为黑&#xff0c;u存在且为红 3.2.1.2 cur为红&#xff0c;f为红&am…

php实现截取姓名中的第一个字作为头像的实战记录

php 截取中文字符串第一个字 substr 函数 在 PHP 中&#xff0c;使用 substr 函数来截取中文字符串的第一个字。由于 PHP 默认的字符编码是 UTF-8&#xff0c;它可以正确处理中文字符。 $chineseString "你好世界"; $firstChar substr($chineseString, 0, 1); e…

【小白专用】Apache2.4+PHP8.3+MYSQL的配置

1.下载PHP和Apache 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.使用Apache作为服务器的话&#xff0c;一定要下载Thread Safe的&#xff0c;否则没有php8apache2_4.dll这个文件&#xff0c; 如果使用IIS的请下载 NON Tread safe的 2.如果…

简单聊聊使用lombok 的争议

大家好&#xff0c;我是G探险者。 项目里&#xff0c;因为我使用了Lombok插件&#xff0c;然后代码走查的时候被领导点名了。 我心想&#xff0c;这么好用的插件&#xff0c;为啥不推广呢&#xff0c;整天写那些烦人的setter&#xff0c;getter方法就不嫌烦么&#xff1f; 领导…

[足式机器人]Part4 南科大高等机器人控制课 Ch05 Instantaneous Velocity of Moving Frames

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch05 Instantaneous Velocity of Moving Frames 1.Instantanenous Velocity of Rotating Frames2.Instantanenous Veloc…

计算机视觉 基于Open3D了解用于网格和点云邻域分析的KD树和八叉树

一、简述 距离计算和邻域分析是理解网格和点云的形状、结构和特征的重要工具。我们这里要基于一些3D库来提取基于距离的信息并将其可视化。 与深度图或体素相比,点云和网格表示 3D 空间中的非结构化数据。点由它们的 (X, Y, Z) 坐标表示,在 3D 空间中可能彼此靠近的两…

Vue3:表格单元格内容由:图标+具体内容 构成

一、背景 在Vue3项目中&#xff0c;想让单元格的内容是由 &#xff1a;图标具体内容组成的&#xff0c;类似以下效果&#xff1a; 二、图标 Element-Plus 可以在Element-Plus里面找是否有符合需求的图标iconfont 如果Element-Plus里面没有符合需求的&#xff0c;也可以在这…