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和安全随机数等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ImmunityCanvas7.26安装详细教程

ImmunityCanvas7.26 大家想必都已经知道了Immunity Canvas7.26武器于2021年3月2日泄露了吧那我就废话不多说了。 很多人已经有了这款工具不得不说这工具很nice如果要买的话一年的话3万美金我的天我穷了。。 简单介绍 Immunity Canvas是美国ImmunitySec出品的安全漏洞检测工具…

[GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练

前言 OpenAI的创始人之一,大神Andrej Karpthy刚在微软Build 2023开发者大会上做了专题演讲:State of GPT(GPT的现状)。 他详细介绍了如何从GPT基础模型一直训练出ChatGPT这样的助手模型(assistant model)。作者不曾在其他公开视频里看过类似的内容,这或许是OpenAI官方…

产品经理在项目周期中扮演的角色Axure的安装与基本使用

目录 一.项目周期流程 二.Axure是什么 三.Axure安装 3.1 一键式安装 3.2 汉化 3.3 授权登录 四.Axure的界面介绍及基本使用 4.1 菜单栏的使用 4.2 工具栏的使用 4.3 页面概要的使用及组件的使用 4.4 组件的样式设计 一.项目周期流程 在一般的项目周期中包含的工作内容有&…

2005-2021年全国各省资本存量测算数据(含原始数据+测算过程+计算结果)

2005-2021年全国各省资本存量测算数据&#xff08;含原始数据测算过程计算结果&#xff09; 1、时间&#xff1a;2005-2021年&#xff08;以2005年为基期&#xff09; 2、范围&#xff1a;30个省市&#xff08;不含西藏&#xff09; 3、指标&#xff1a;固定资产形成总额、固…

利用工具JStack排查:死锁问题和CPU100%问题

无论是再面试过程中还是再实际项目开发当中我们都有可能遇到这两个问题。我之前有同学面试这两个问题都有问道过。哈哈哈。所以我绝对把他们了解下并利用博客记录。 1、工具JStack是什么&#xff1f; JStack可以显示Java应用程序中每个线程的堆栈跟踪&#xff0c;帮助开发人员…

Azure Machine Learning - 使用自己的数据与 Azure OpenAI 模型对话

在本文中&#xff0c;可以将自己的数据与 Azure OpenAI 模型配合使用。 对数据使用 Azure OpenAI 模型可以提供功能强大的对话 AI 平台&#xff0c;从而实现更快、更准确的通信。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队…

台式扫描电镜中的扫描速度和扫描模式如何选择?

台式扫描电镜&#xff08;SEM&#xff09;是一种利用电子束扫描样品表面&#xff0c;通过检测样品反射或发射的次级电子、背散射电子、X 射线等信号&#xff0c;来获取样品的形貌、结构、组成和分布等信息的仪器。台式扫描电镜具有体积小、操作简单、样品制备方便、分辨率高、成…

量化交易与人工智能:Python库的应用与效用

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 量化交易简介 量化交易是一种利用计算机算法执…

VUE+webrtc-streamer 实现实时视频播放(监控设备-rtsp)

效果 下图则启动成功&#xff0c;此时在浏览器访问127.0.0.1:8000可以看到本机监控画面 1、下载webrtc-streamer 地址&#xff1a;https://github.com/mpromonet/webrtc-streamer/releases 2、解压下载包 3、双击webrtc-streamer.exe启动服务 4、将下载包html文件夹下webrt…

Vue笔记-在axios中的than函数中使用this需要注意的地方

在Vue中&#xff0c;可以使用this关键字来访问到组件中定义的变量。然而&#xff0c;在axios的then函数中&#xff0c;this关键字的作用域会改变&#xff0c;会指向axios对象本身而不是Vue组件实例。因此&#xff0c;不能直接访问到Vue组件中定义的变量。 解决这个问题的一种方…

2023/12/11 作业

1.思维导图 2.作业 成果&#xff1a; 第一个头文件 #ifndef TEST3GET_H #define TEST3GET_H #include <QWidget> #include<QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class test3get; } QT_END_NAMESPACE class test3get : public QWidget { Q_OBJE…

安卓.apk的文件app应用程序开发后如何安装运行到真机上测试?

当您完成了一个安卓app的开发之后&#xff0c;进行真机测试是确保应用程序稳定运行的关键步骤之一。下面我们会讲述几种将安卓app安装到手机进行测试的方法&#xff0c;请根据具体情况选择合适的方式。 图片来源&#xff1a;安卓.apk的文件app应用程序开发后如何安装运行到真机…

C++ 指针常量和常量指针的区别

指针常量 指针常量&#xff1a;顾名思义它就是一个常量&#xff0c;但是是指针修饰的。 格式为&#xff1a; int * const p //指针常量在这个例子下定义以下代码&#xff1a; int a&#xff0c;b&#xff1b; int * const p&a //指针常量 //那么分为一下两种操作 *p9;//操…

linux(5):linux基础命令第五弹

在linux基础命令第四弹中http://t.csdnimg.cn/tvuNl我们了解了echo、tail命令、管道符和vim文本编辑器的相关内容。这一篇我们会了解关于命令选项的说明 我们在之前的学习中&#xff0c;发现命令中的选项是非常多的&#xff0c;比如-l -c -m -r -w 等等&#xff0c;命令有很多&…

C++学习笔记之五(String类)

C 前言getlinelength, sizec_strappend, inserterasefindsubstrisspace, isdigit 前言 C是兼容C语言的&#xff0c;所以C的字符串自然继承C语言的一切字符串&#xff0c;但它也衍生出属于自己的字符串类&#xff0c;即String类。String更像是一个容器&#xff0c;但它与容器还…

12月11日作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示登录成功&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xff0c;弹…

被迫搬家,宽带迁移怎么办?

广州一栋违建烂尾楼&#xff0c;13年里从未停止出租&#xff0c;年年住满人。这栋楼没有贴外墙&#xff0c;裸露的水泥表面都被雨水腐蚀&#xff0c;很多阳台没有建好&#xff0c;只是简单加装了护栏&#xff0c;存在巨大安全隐患。 为什么烂尾楼年年满人呢&#xff1f; 因为它…

基于ssm乐购游戏商城系统论文

摘 要 随着社会的发展&#xff0c;游戏品种越来越多&#xff0c;计算机的优势和普及使得乐购游戏商城系统的开发成为必需。乐购游戏商城系统主要是借助计算机&#xff0c;通过对信息进行管理。减少管理员的工作&#xff0c;同时也方便广大用户对个人所需信息的及时查询以及管理…

基于深度学习的yolov5入侵检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介IntroductionYOLOv5 Overview入侵检测系统架构1. 数据采集2. YOLOv5模型训练3. 实时监测4. 告警与反馈 性能评估与优化 二、功能三、系统四. 总结 一项目简…

Huawei Auth-HTTP Server 1.0 存在任意文件读取漏洞 附POC软件

@[toc] Huawei Auth-HTTP Server 1.0 存在任意文件读取漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学…