写作背景

最近在研究 GitHub 多账号管理 的问题,这其中就涉及到了 SSH 的连接方式,因此不得不了解一下 SSH 的工作原理。

一番搜索和实践后发现,这里面的水其实很深,真要理解透彻可能需要去读几本关于密码学的书。本人并没有多大兴趣去研究这个,所以只是浅谈,但对于只是使用 SSH 工具的人来说,这完全够用了。

几年前我了解到的是 SSH 使用非对称加密算法(RSA)来完成对称加密算法的密钥交换,最后使用对称加密算法实现数据安全传输。现在网上查到的却是先使用 Diffie-Hellman(DH)算法完成对称加密算法的密钥交换,再通过客户端的公钥识别身份。这让我丈二和尚摸不着头脑。

直到写这篇文章,在搜索了 SSH1 和 SSH2 的区别后,我才找到答案。原来这里面说的其实是两个不同的东西,一个是 SSH1,一个是 SSH2。现在都流行使用 SSH2,所以网上搜到的大多都是 SSH2 方面的东西。

如果你直接在网上搜索 “SSH 实现原理”,那么搜到的大多都只是在谈 SSH 的身份认证部分而非整一个工作原理。试着搜索 “SSH 协商会话加密”,你将会看到不一样的内容。

SSH2 连接过程

SSH2 的整一个连接过程大体上可分为两个部分:协商会话加密身份认证

这其中还用到了 对称加密非对称加密哈希 算法(MD5)。

注意 SSH2 是建立在 TCP/IP 协议之上的应用层协议,所以是在经过 TCP三次握手 后才开始进行 SSH 连接,当然这个过程也是依赖于 TCP/IP,不过这些过程对于 SSH 来说是透明的,本章也不会作这方面的说明。

一、协商会话加密

协商会话加密 使用 Diffie-Hellman 算法生成会话密钥,具体流程如下。(大概流程)

  1. 客户端和服务端共同选定一个大素数作为 种子值
  2. 独立地,双方各自确定另一个素数,这个素数对另一方保密,简称 私钥
  3. 通过 种子值私钥,使用某种函数生成各自的 公钥
  4. 双方交换各自的 公钥
  5. 双方使用各自的 私钥、收到的 公钥种子值 计算出 共享密钥。虽然双方的 私钥公钥 都是不同的,但它们最后计算出来的 共享密钥 都是相同的。就这样,双方在不安全的网络中协商出了一个只有双方才知道的 共享密钥(这不得不让人惊叹数学的精妙啊),其它人即使拿到了 种子值公钥,也无法确定 共享密钥,因为它们不知道 私钥私钥 在整个过程中都没有被传输。
  6. 使用 共享密钥 加密随后的所有通信。

注意这里的公钥、私钥和下面要讲的非对称加密的公钥、私钥是不一样的,不是同一个东西。

二、身份认证

共享密钥 确定后,接下来的通信都使用 共享密钥 进行加密和解密,因此是安全的,但我们还没有确认双方的身份。

客户端识别服务端是通过人工进行确认的。我们在第一次连接服务器时,都会弹出一个警告,让用户确定是否进行连接。警告的内容包含了服务器的 公钥指纹,如下图。

既然 公钥 是公开的,那中间人是不是也可以伪造这样的信息,让我们误以为是真实的服务器发出来的?答案是“是的”,所以我们还需要确定服务端是否拥有对应的私钥。不过查阅相关的文章,好像没有这样一个过程,都是在用户确定服务端公钥(回复yes)后就进行下一步操作(确认客户端身份)。个人感觉不合理,应该是要有的,具体我也没有深究,毕竟这篇文章是 浅谈 嘛!(好像被发现为什么要用这个做标题了 。)

其实要确定服务端是否拥有对应的私钥也很容易,接下来讲的如何确定客户端身份会讲到,道理是一样。

服务端识别客户端身份有两种方式:账号密码SSH密钥对

账号密码 验证的方式很容易理解,客户端将用户名和密码用 共享密钥 加密后发给服务端,服务端再使用 共享密钥 解密,取得用户名和密码,再以此验证用户信息。

SSH密钥对 需要管理员事先将客户端的公钥上传到服务端对应用户的 ~/.ssh/authorized_keys 文件中,再进行以下流程。

  1. 客户端将公钥ID发送给服务端
  2. 服务端在对应用户的 ~/.ssh/authorized_keys 中搜索与之匹配的公钥
  3. 如果找到匹配的公钥,服务端将会生成一个 随机数 ,并使用该公钥加密该 随机数,得到 加密随机数
  4. 服务端将 加密随机数 发送给客户端
  5. 客户端收到 加密随机数 后,如果其持有对应的私钥,那么它就可以使用私钥解密,从而得到 随机数
  6. 客户端将 随机数共享密钥 组合进行 MD5 加密,并将 MD5值 发送给服务端
  7. 服务端用同样的方式计算 MD5值 ,并与客户端发送的 MD5值 进行比较。如果相等,则身份认证通过。

前面说到在 协商会话加密 后,以后的通信都会使用 共享密钥 进行加密。在使用 SSH密钥对 进行 身份认证中,是可以不使用 共享密钥 进行加密的,因为整个过程所用到的 加密随机数MD5值 是可以公开的。具体在真实的场景中有没有使用 **共享密钥 ** 加密这个过程我也不太清楚(浅谈浅谈),不过不会有什么安全问题。

问题

到这里,整个通信流程大家应该都理解了,不过我猜大家还会有一些问题。

为什么不先进行身份认证,之后再进行协商会话加密呢?

一开始我以为是为了连接速度,后来查了 SSH1 和 SSH2 的区别才发现,问题并不简单。

下面引用 海里木有鱼 的 SSH1和SSH2的区别 内容来解答这个问题。

SSH2 避免了 RSA 的专利问题,并修补了 CRC 的缺陷。
SSH2 用数字签名算法(DSA)和 Diffie-Hellman(DH)算法代替 RSA 来完成对称密钥的交换

一切,都是利益的纠葛!

本地那么多个公钥,客户端怎么知道选择哪一个?

ssh-agent 自动寻找,或者 ssh 登录时指定私钥(公钥和私钥名相同)。详细内容可以看 SSH多种远程登录方法

客户端和服务端是如何共同确定一个种子值的?

由于这个种子值是可以公开的,所以不怕被第三方知道。可以由客户端或者服务端自己随机生成然后发给对方,只要对方同意就行了。就像两个人去吃饭,讨论要选择哪个餐馆是一样的道理。

参考链接

Understanding the SSH Encryption and Connection Process,Justin Ellingwood

SSH 加密和连接过程,WqyJh

SSH1和SSH2的区别,海里木有鱼

密码学原理与实践_浅谈SSH2工作原理相关推荐

  1. svc的参考文献_浅谈SVC的原理及作用

    浅谈 SVC 的原理及作用 超(特)高压运行检修公司 自贡中心 涂洪骏 摘要: 介绍了静止补偿器 (SVC) 的工作特性.基本原理.运行方式,重点针对 SVC 的作用进行了分析. 关键词 :静止补偿器 ...

  2. 观察者模式(浅谈监听器工作原理)

    从某种角度来说,我们总是处于两种生活状态:观察者与被观察者.当处于观察者状态时,被观察的对象会向我们发出某种信息,使我们产生某种心理活动或行为状态的改变.当我们处于被观察者状态时,我们的行为活动又可以 ...

  3. 浅谈搜索引擎工作原理

    做为网页开发者,仅仅会编写代码完成业务功能是远远不够的,你做的网站最后需要搜索引擎这个公共入口来呈现给用户.所以搜索引擎优化是及其重要的,而要了解如何优化自己的网站从而适应搜索引擎,我们需要先了解搜索 ...

  4. adc0832工作原理详解_单片机ADC的工作原理

    单片机的ADC可以将模拟量转化为数字量 不同品牌的单片机ADC的配置方法有一定的差异,但基本方法和原理是一样的,启动ADC转换后,可以等待转换完成然后读取数据,或者设置为转换完成产生中断然后读取数据. ...

  5. 实现原理 扫描枪_扫描枪的工作原理

    原标题:扫描枪的工作原理 随着条形码软件在各个行业中的应用,条码打印机和扫描枪越来越多出现在人们的视线中, 今天让我们来了解下扫描枪的详细信息. 扫描枪的常用接口类型有以下三种: (1)SCSI(小型 ...

  6. java转换成class文件_浅谈JVM编译原理-.java文件转变为.class文件的过程

    为什么需要编译? 我们平常写代码,有规范的命名方式,都能够看得懂,但是我们写的代码计算机是看不懂的,所以需要编译,也就是一个转换的过程,如下: 1.这个是咱们平时写的代码,就比较好理解,对人友好 2. ...

  7. java tomcat原理图,浅谈tomcat工作原理

    一个web服务器也叫做HTTP服务器,因为它使用HTTP协议同客户端(即浏览器)通信.一个基于Java的web服务器用到的两个重要类:java.net.Socket和java.net.ServerSo ...

  8. 浅谈会话劫持原理及实践

    <监视你的一举一动> ---浅谈会话劫持原理及实践 前言 通常,大家所说的入侵,都是针对一台主机,在获得管理员权限后,就很是得意:其实,真正的入侵是占领整个内部网络.针对内部网络的攻击方法 ...

  9. 《计算机辅助教学及应用实践研究》,《论文_浅谈计算机辅助教学(定稿)》

    <论文_浅谈计算机辅助教学(定稿)> (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 摘要:计算机辅助教学中要用到多媒体课件 ...

  10. 浅谈:Spring Boot原理分析,切换内置web服务器,SpringBoot监听项目(使用springboot-admin),将springboot的项目打成war包

    浅谈:Spring Boot原理分析(更多细节解释在代码注释中) 通过@EnableAutoConfiguration注解加载Springboot内置的自动初始化类(加载什么类是配置在spring.f ...

最新文章

  1. c语言通讯录打电话,C语言实现简易通讯录 | 术与道的分享
  2. TEE(Trusted Execution Environment)简介
  3. 从PCB焊接角度谈画PCB图时应注意的问题
  4. docker公共存储库_查找并修复docker镜像安全漏洞
  5. Flutter OpenContainer 容器转换过渡 Material Design 设计风格的实践
  6. 修改SQL Service数据库排序规则
  7. 多进程event通信
  8. android 关闭jack_安卓编译 Jack server 错误问题解决办法
  9. 通过银行卡的Bin号来获取银行名称
  10. 特斯拉开火,状告5名前员工、小鹏汽车、Zoox身陷漩涡
  11. id: cannot find name for group ID 528
  12. MySQL中创建时间和更新时间的自动更新
  13. 解决win10设备管理器及操作找不到蓝牙
  14. 项目二-成员函数、友元函数和一般函数之区别
  15. FORTIFY_SOURCE详解
  16. c#split方法拆分为数据_C# 根据分隔符拆分Excel单元格数据
  17. 美术绘画之原画场景深入刻画-张聪-专题视频课程
  18. 计算机专业可以考小学老师吗,计算机专业能报考湖南小学教师资格证吗?
  19. mongodb-18.聚合查询练习1
  20. 《大空头》书中的精髓:理性在财富面前无足轻重,人类的贪婪和无所谓,造出了次贷危机这个怪兽。

热门文章

  1. vue学习笔记-接口调用-axios
  2. android runnable传递参数,Android – 如何将数据传递到RunOnUiThread中的Runnable?
  3. c语言输入身高计算标准体重_体质测试 | 身高 / 体重测试评分标准及方法
  4. 陆振波的svm的matlab代码的解释,陆振波SVM的MATLAB代码解释
  5. matlab实现矩形脉冲串,python中的矩形脉冲串
  6. MybatisPlus的CRUD操作
  7. mysql 8.0 (ga)_MySQL 8.0.20 GA 发布
  8. triz矛盾矩阵_怎样利用项目TRIZ矛盾定义法,突破产品“创
  9. confirm 调用ajax,jQuery ajax中使用confirm,确认是否删除的简单实例
  10. 02_创建 CA 根证书和秘钥