文档章节

一、ssh 协议:SSH 传输层协议

for。
 for。
发布于 2016/07/12 22:33
字数 665
阅读 248
收藏 4
点赞 1
评论 0
ssh

1. 二进制协议格式

每个数据包为以下格式

uint32      packet_length
byte        padding_length
byte[n1]    payload; n1 = packet_length - padding_length - 1
byte[n2]    random padding; n2 = padding_length
byte[m]     mac (Message Authentication Code - MAC); m = mac_length

输入图片说明

packet_length: 以字节为单位的数据包长度,不包括 'mac' 或 'packet_length' 域自身。

padding_length: 'random padding' 的长度(字节)。

random padding: 任意长度的填充,使(packet_length || padding_length || payload || random padding)的总长度是加密分组长度或 8 中较大者的倍数。最少必须有 4 字节的填充。填充应包含随机字节。填充的最大长度为 255 字节。

mac: 消息验证码。如果已经协商了消息验证,该域包含 MAC。初始时,MAC 算法必须是"none"。

2. 协议过程

1) 协议版本交换

当 TCP 连接建立后,双方都必须发送一个标识字符。该标识字串必须是

SSH-protoversion-softwareversion SP comments CR LF

protoversion: 协议版本

softwareversion: 软件版本

SP: 空格

comments: 可选字符串

CR: 回车

LF: 换行

如使用同一主机上使用 OpenSSH 时,客户端发送:

输入图片说明

服务器端都会发送:

输入图片说明

2) 算法协商

密钥交换从每一方发送如下数据包开始:

byte        SSH_MSG_KEXINIT
byte[16]    cookie (random bytes)
name-list   kex_algorithms
name-list   server_host_key_algorithms
name-list   encryption_algorithms_client_to_server
name-list   encryption_algorithms_server_to_client
name-list   mac_algorithms_client_to_server
name-list   mac_algorithms_server_to_client
name-list   compression_algorithms_client_to_server
name-list   compression_algorithms_server_to_client
name-list   languages_client_to_server
name-list   languages_server_to_client
boolean     first_kex_packet_follows
uint32      0 (为将来扩展预留)`

cookie: 必须是一个由发送方生成的随机值。它的作用是使任何一方都不可能对密钥和会话标识符拥有完全决定权。

kex_algorithms: 密钥交换算法。

server_host_key_algorithms: 受支持的为服务器主机密钥服务的算法的名称列表,按优先级排序。

encryption_algorithms: 可接受的对称加密算法(也称为加密器)的名称列表,按优先级排序。

mac_algorithms: 可接受的 MAC 算法的名称列表,按优先级排序。

compression_algorithms: 可接受的压缩算法的名称列表,按优先级排序。

languages: 语言标志的名称列表,按优先级排序。

first_kex_packet_follows: 表明是否有一个猜测的密钥交换数据包跟随。

如以 OpenSSH 为例,客户端和服务器都会发送:

输入图片说明

3) Diffie-Hellman 密钥交换

首先,客户端发送:

byte    SSH_MSG_KEXDH_INIT
mpint   e

服务器响应如下:

byte    SSH_MSG_KEXDH_REPLY
string  K_S,服务器公钥和证书 (
mpint   f
string  s,对 H 的签名

密钥交换在每一方发送一个 SSH_MSG_NEWKEYS 消息后结束

byte    SSH_MSG_NEWKEYS

以 OpenSSH 为例

客户端发送:

输入图片说明

服务端响应:

输入图片说明

客户端发送 New Keys:

输入图片说明

服务端发送 New Keys:

输入图片说明

之后,数据都以加密方式传输。

4) 总体过程

输入图片说明

参考文档

http://git.oschina.net/lowkey2046/libssh/tree/master/document

© 著作权归作者所有

共有 人打赏支持
for。

for。

粉丝 80
博文 47
码字总数 18257
作品 0
深圳
程序员
SSH和SFTP简介

传统FTP 在传输机制和实现原理上是没有考虑安全机制的,因为它们在网络上用明文传送数据、用户帐号和用户口令,别有用心的人非常容易地就可以截获这些数据、用户帐 号和用户口令。而且,这些...

老先生二号
2017/06/25
0
0
一:Ubuntu下SSH安装及配置

一:SSH(安全外壳协议)的简单介绍: SSH 为 Secure Shell 的缩写,SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用...

牧羊人Berg
2016/04/29
46
0
优秀的 Android SSH 客户端

SSH是工作在传输层和应用层之上的流行网络安全协议,能利用128位密钥加密发送和接收的信息,确保主机之间的通信不会在传输过程中被中间人拦 截。SSH常被用于登陆到远程机器执行命令,系统管理...

oschina
2013/06/15
42.6K
19
远程登录:telnet与ssh

1,什么是远程登录 远程登录是用户使用ssh,telnet等命令,登录到一台远程服务器进行操作,使自己的计算机暂时成为远程主机的一个仿真终端的过程。 登录系统后所有的操作都是对远程主机的操作...

nao
2014/03/23
0
0
优秀的 Android SSH 工具推荐

Secure Shell(SSH)是工作在应用层和传输层之上的网络安全协议,利用128位公钥加密接收和发送的信息。SSH能保证两个主机之间的通信不被中间人拦截。作为一种安全保护协议,SSH常被用于安全数据...

小卒过河
2011/10/24
20.7K
3
Java 实现 SSH 协议的客户端登录认证方式

背景 在开篇之前,让我们先对 SSH 协议有个宏观的大致了解,这样更有利于我们对本文的加深了解。首先要提到的就是计算机网络协议,所谓计算机网络协议,简单的说就是定义了一套标准和规则, ...

IBMdW
2013/08/27
2.5K
2
计算机网络每一层使用的协议

1.应用层/表示层 超文本传输协议HTTP HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务...

rogertan30
2016/10/24
0
0
使用ssh隧道+privoxy实现Linux全局代理

使用ssh隧道+privoxy实现Linux全局代理 ssh简介 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,...

aaronchou0
07/18
0
0
Huawei设备Stelnet

1.Telnet是基于TCP协议的应用,telnet是基于internet的远程登录,要求用来承载的传输层是可靠的,面向连接的协议类型,所以默认使用的是TCP的23端口号。telnet是一种明文传输协议,数据在传输...

kekeAlice
2016/09/29
0
0
SSH、SSL与HTTPS

关于加密 在解释SSH、SSL与HTTPS协议之前我先介绍一下非对称加密协议。在1976年以前,所有的加密都采用对称加密,既A使用某种加密规则对信息加密,B收到信息后逆向加密规则解密数据。这通信方...

我在睡觉
2017/03/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
20分钟前
0
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
43分钟前
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
0
0
流利阅读笔记33-20180722待学习

黑暗中的生物:利用奇技淫巧快活生存 Daniel 2018-07-22 1.今日导读 如果让你在伸手不见五指的黑暗当中生存,你能熬过几天呢?而大千世界,无奇不有。在很多你不知道的角落,有些生物在完全黑...

aibinxiao
昨天
6
0
Hystrix降级逻辑中如何获取触发的异常

通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hystrix来保护自己的服务不被外部依赖方拖垮的情况。但是实际...

程序猿DD
昨天
1
0
gin endless 热重启

r := gin.New()r.GET("/", func(c *gin.Context) {c.String(200, config.Config.Server.AppId)})s := endless.NewServer(":8080", r)s.BeforeBegin = func(add string) ......

李琼涛
昨天
1
0
JAVA模式之代理模式

平时一直在用spring,spring中最大的特效IOC和AOP,其中AOP使用的就是代理模式.闲着无聊,随手写了一个代理模式,也记录下代理模式的实现Demo. 比如现在有一个场景是:客户想要增加一个新的功能,...

勤奋的蚂蚁
昨天
0
0
ES15-JAVA API 索引管理

1.创建连接 创建连接demo package com.sean.esapi.client;import java.net.InetSocketAddress;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.clien......

贾峰uk
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部