一、JSch简介

JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的 程序中。同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器。

JSch接口文档链接:https://epaul.github.io/jsch-documentation/javadoc/com/jcraft/jsch/JSch.html

JSch官方说明文档:http://www.jcraft.com/jsch/

二、**交换

**交换(英语:Key exchange,也称key establishment)是密码学中两方交换**以允许使用某种加密算法的过程。

用于决定客户端与服务器之间在握手时如何身份验证。

如果发送方和接收方希望交换加密消息,则双方都必须配有**以加密发送的消息和解密收到的消息。它们所需的事物取决于可能使用的加密技术。如果双方使用一本代码,则需要一份相同的编码簿。如果使用密码,则需要适当的**。如果该密码是对称**加密,双方需要同一份**副本。如果是公钥/私钥结构的公开**加密,则双方需要其他人的公钥。

三、mac加密(消息认证码)

JSch 在工作中遇到的相关问题

JSch 在工作中遇到的相关问题

Mac算法即首先对消息进行一次加密,然后对加密之后的消息,再次进行消息摘要处理。大大的增强了消息的安全性。

用于创建密码散列函数,消息流每个数据块的加密散列

java使用详情链接:https://www.jianshu.com/p/bf932bceccf9

四、cipher(密码套件)

密码套件(Cipher suite)是传输层安全(TLS)/安全套接字层(SSL)网络协议中的一个概念。在TLS 1.3之前,密码套件的名称是以协商安全设置时使用的身份验证、加密、消息认证码(MAC)和**交换算法组成。TLS 1.3仅能使用AEAD密码套件。

五、SSL/TLS单向认证

  1. client_hello

客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下:

支持的最高TSL协议版本version,从低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,当前基本不再使用低于 TLSv1 的版本; 客户端支持的加密套件 cipher suites 列表, 每个加密套件对应前面 TLS 原理中的四个功能的组合:认证算法 Au (身份验证)、**交换算法 KeyExchange(**协商)、对称加密算法 Enc (信息加密)和信息摘要 Mac(完整性校验); 支持的压缩算法 compression methods 列表,用于后续的信息压缩传输; 随机数 random_C,用于后续的**的生成; 扩展字段 extensions,支持协议与算法的相关参数以及其它辅助信息等,常见的 SNI 就属于扩展字段,后续单独讨论该字段作用。

  1. server_hello+server_certificate+sever_hello_done

server_hello, 服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite,选择的压缩算法 compression method、随机数 random_S 等,其中随机数用于后续的**协商; server_certificates, 服务器端配置对应的证书链,用于身份验证与**交换; server_hello_done,通知客户端 server_hello 信息发送结束;

  1. 证书校验

[证书链]的可信性 trusted certificate path,方法如前文所述; 证书是否吊销 revocation,有两类方式离线 CRL 与在线 OCSP,不同的客户端行为会不同; 有效期 expiry date,证书是否在有效时间范围; 域名 domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析;

  1. client_key_exchange+change_cipher_spec+encrypted_handshake_message

client_key_exchange,合法性验证通过之后,客户端计算产生随机数字 Pre-master,并用证书公钥加密,发送给服务器; 此时客户端已经获取全部的计算协商**需要的信息:两个明文随机数 random_C 和 random_S 与自己计算产生的 Pre-master,计算得到协商**; enc_key=Fuc(random_C, random_S, Pre-Master) change_cipher_spec,客户端通知服务器后续的通信都采用协商的通信**和加密算法进行加密通信; encrypted_handshake_message,结合之前所有通信参数的 hash 值与其它相关信息生成一段数据,采用协商** session secret 与算法进行加密,然后发送给服务器用于数据与握手验证;

  1. change_cipher_spec+encrypted_handshake_message

服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,计算得到协商**:enc_key=Fuc(random_C, random_S, Pre-Master); 计算之前所有接收信息的 hash 值,然后解密客户端发送的 encrypted_handshake_message,验证数据和**正确性; change_cipher_spec, 验证通过之后,服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的**与算法进行加密通信; encrypted_handshake_message, 服务器也结合所有当前的通信参数信息生成一段数据并采用协商** session secret 与算法加密并发送到客户端;

  1. 握手结束

客户端计算所有接收信息的 hash 值,并采用协商**解密 encrypted_handshake_message,验证服务器发送的数据和**,验证通过则握手完成;

  1. 加密通信

开始使用协商**与算法进行加密通信。

六、SSL/TLS双向认证流程

和单向认证几乎一样,只是在client认证完服务器证书后,client会将自己的证书client.crt传给服务器。服务器验证通过后,开始秘钥协商。

相关博客:https://blog.csdn.net/ustccw/article/details/76691248/

相关文章: