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和安全随机数等。
相关文章:

Java网络编程——安全网络通信
在网络上,信息在由源主机到目标主机的传输过程中会经过其他计算机。在一般情况下,中间的计算机不会监听路过的信息。但在使用网上银行或者进行信用卡交易时,网络上的信息有可能被非法分子监听,从而导致个人隐私的泄露。由于Intern…...
云原生数据库是什么?它的作用是啥?
目前来说,各厂商的云原生数据库在演进路线上分成了两个略有不同的路径来解决不同的问题。 一种是各大公有云厂商选择的,优先保证上云兼容性的路线,就是基于存算分离架构对传统数据库进行改造的路线:通过把大量的日志操作放到后台…...
使用ansible批量初始化服务器
简介 本文详细介绍ansible怎么批量初始化服务器,包括ansible批量初始化服务器详细配置和步骤,有需要的小伙伴们可以参考借鉴,希望对大家有所帮助。 详细步骤 1、ansible要初始化的主机 [rootnginx ansible]# tail -3 /etc/ansible/hosts …...

国标GB28181安防视频云平台EasyCVR出现持续重启现象,是什么问题?该如何解决?
视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能…...
【APP安卓测试工具】adb(Android Debug Bridge)
1.常见的命令 列出已连接的设备 adb device安装 adb install <APK文件路径>卸载 adb uninstall <APK文件路径>启动和停止 adb shell am start -n <包名>[/<Activity>]adb shell am force -stop <包名>截屏和录屏 adb shell screencap <文件路…...
图像融合领域的挑战
图像融合是将来自不同传感器或不同时间的多个图像集成为信息更丰富的单个图像的过程,通常预计更有利于人类或机器感知或进一步的图像处理任务。 以下是图像融合研究中的一些众所周知的挑战: 保持图像质量:确保融合图像保留每个源图像的重要特…...

Tomcat配置成服务、开机自启动
Tomcat配置成服务、开机自启动 问题解决方案 问题 在配置成开机自启动的服务时,遇到了如下提示。 最终原因是因为双击apache-tomcat-9.0.83\bin\tomcat9w.exe,在弹出的的“Startup”选项卡中的mode没有设置为Java 解决方案 右键“我的电脑”——管理—…...

IntelliJ IDEA创建一个spark的项目
在开始之前,需要说明的是 要跑通基本的wordcount程序,是不需要在windows上安装 hadoop 和spark的,因为idea在跑程序的时候,会按照 pom.xml配置文件,从指定的 repository源,按照properties指定的版本&#x…...

【数据库】数据库多种锁模式,共享锁、排它锁,更新锁,增量锁,死锁消除与性能优化
多种锁模式的封锁系统 专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会…...

串口通信(1)-硬件知识
本文讲解串口通信的硬件知识。让读者快速了解硬件知识,为下一步编写代码做基础。 目录 一、概述 二、串口通信分类 2.1信息的传送方向进行分类 2.2同步通信和异步通信 三、串口协议 3.1 RS232 3.1.1 电气特性 3.1.2 连接器的机械特性 3.1.3 连接类型 3.1…...

越南语翻译,人工翻译哪个值得信赖?
近年来,随着中越两国的交流日益频繁,为了促进双方的交流与理解,市场上对越南语翻译的需求也日益增加。那么,如何做好越南语翻译,人工翻译哪家公司值得信赖呢? 据了解,中文翻译越南语是一项颇具挑…...

攻防世界题目练习——Web引导模式(五)(持续更新)
题目目录 1. FlatScience2. bug3. Confusion1 1. FlatScience 参考博客: 攻防世界web进阶区FlatScience详解 题目点进去如图,点击链接只能看到一些论文pdf 用dirsearch和御剑扫描出一些隐藏文件: robots.txt: admin.php: login.php: f…...
attack vector
攻击介质,是指可以攻击信息系统,破坏其安全性的特定路径、方法或是情景。 vector 此处并不是向量的意思。...

好看的早上问候语早安图片,今天最新唯美温馨祝福语
1、天气冷了,情谊不凉,树叶黄了,思念不忘,问候像一杯热茶,让人暖心!祝愿我们与健康平安同行!朋友们,大家早上好! 2、多一个人牵挂是一种幸福;多一个人相知是一…...

人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码
人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码 目录 人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码 1. 前言 2.人体关键点检测方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法࿱…...

聚类分析 | Matlab实现基于谱聚类(Spectral Cluster)的数据聚类可视化
聚类分析 | Matlab实现基于谱聚类(Spectral Cluster)的数据聚类可视化 目录 聚类分析 | Matlab实现基于谱聚类(Spectral Cluster)的数据聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于谱聚类(Spectral Cluster)的聚类算法可视化(完…...

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针测试
目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针(非函数指针): 有类型的函数指针: void 类型的指针: 结语 前言 进行单元测试之后,但凡…...

关系型数据库-SQLite介绍
优点: 1>sqlite占用的内存和cpu资源较少 2>源代码开源,完全免费 3>检索速度上十几兆、几十兆的数据库sqlite很快,但是上G的时候最慢 4>管理简单,几乎无需管理。灵巧、快速和可靠性高 5>功能简…...

使用shell脚本将一台虚拟机上面数据分发到其他虚拟机上面xsync
目录 1,功能2,注意点3,shell脚本介绍4,bash内容 1,功能 使用shell脚本将一台虚拟机上面数据分发到其他虚拟机上面。 2,注意点 需要修改的地方:hadoop250 hadoop251 hadoop252 hadoop253 hado…...
OpenGL学习(二)绘制三维图形 固定管线
一.简单步骤 考虑顶点数据上色旋转 二.完整代码 myopenglwidget.h // An highlighted block #ifndef MYOPENGLWIDGET_H #define MYOPENGLWIDGET_H #include <QOpenGLWidget> #include <QOpenGLFunctions> #include <QOpenGLShaderProgram> #include <Q…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
深度解析云存储:概念、架构与应用实践
在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...
Cursor AI 账号纯净度维护与高效注册指南
Cursor AI 账号纯净度维护与高效注册指南:解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后,许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...

基于Python的气象数据分析及可视化研究
目录 一.🦁前言二.🦁开源代码与组件使用情况说明三.🦁核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.🦁演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...

RKNN开发环境搭建2-RKNN Model Zoo 环境搭建
目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程. 本…...
OCC笔记:TDF_Label中有多个相同类型属性
注:OCCT版本:7.9.1 TDF_Label中有多个相同类型的属性的方案 OCAF imposes the restriction that only one attribute type may be allocated to one label. It is necessary to take into account the design of the application data tree. For exampl…...