图解SSH原理及两种登录方法
SSH(Secure Shell)是一套协议标准,可以用来实现两台机器之间的安全登录以及安全的数据传送,其保证数据安全的原理是非对称加密。
传统的对称加密使用的是一套秘钥,数据的加密以及解密用的都是这一套秘钥,可想而知所有的客户端以及服务端都需要保存这套秘钥,泄露的风险很高,而一旦秘钥便泄露便保证不了数据安全。
非对称加密解决的就是这个问题,它包含两套秘钥 - 公钥以及私钥,其中公钥用来加密,私钥用来解密,并且通过公钥计算不出私钥,因此私钥谨慎保存在服务端,而公钥可以随便传递,即使泄露也无风险。
保证SSH安全性的方法,简单来说就是客户端和服务端各自生成一套私钥和公钥,并且互相交换公钥,这样每一条发出的数据都可以用对方的公钥来加密,对方收到后再用自己的私钥来解密。

链接创建
由上一张图可以看出来,两台机器除了各自的一套公、私钥之外,还保存了对方的公钥,因此必然存在一个交换各自公钥的步骤。实际上并不是简单的各自发送公钥,而是存在一些专门的算法。这一步在首次链接时、数据传送之前发生。

- 客户端发起链接请求
- 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
- 客户端生成密钥对
- 客户端用自己的公钥异或会话ID,计算出一个值,并用服务端的公钥加密
- 客户端发送加密后的值到服务端,服务端用私钥解密
- 服务端用解密后的值异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
- 至此,双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
这里有一个有趣的地方,两台机器第一次使用SSH链接时,当服务端返回自己的公钥(第2步)的时候,客户端会有一条信息提示,大意是无法验证对方是否可信,并给出对方公钥的MD5编码值,问是否确定要建立链接。
这是因为SSH虽然传输过程中很安全,但是在首次建立链接时并没有办法知道发来的公钥是否真的来自自己请求的服务器,如果有人在客户端请求服务器后拦截了请求,并返回自己的公钥冒充服务器,这时候如果链接建立,那么所有的数据就都能被攻击者用自己的私钥解密了。这也就是所谓的中间人攻击。

利用密码登录
SSH还常用来远程登录到别的机器,有两种常用的方法,第一种便是账号密码登录。

- 服务端收到登录请求后,首先互换公钥,详细步骤如上一节所述。
- 客户端用服务端的公钥加密账号密码并发送
- 服务端用自己的秘钥解密后得到账号密码,然后进行验证
- 服务端用客户端的公钥加密验证结果并返回
- 客户端用自己的秘钥解密后得到验证结果
利用公钥登录
有些时候并不是开发者手动去连接服务器,而是客户端的程序需要连接到服务器,这时候用密码登录就比较不方便,一是需要处理输入密码的问题,二是需要想办法安全的储存密码到程序里,这种情况下便可以利用公钥来进行无密码登录。

- 客户端用户必须手动地将自己的公钥添加到服务器一个名叫authorized_keys的文件里,顾名思义,这个文件保存了所有可以远程登录的机器的公钥。
- 客户端发起登录请求,并且发送一个自己公钥的指纹(具有唯一性,但不是公钥)
- 服务端根据指纹检测此公钥是否保存在authorized_keys中
- 若存在,服务端便生成一段随机字符串,然后利用客户端公钥加密并返回
- 客户端收到后用自己的私钥解密,再利用服务端公钥加密后发回
- 服务端收到后用自己的私钥解密,如果为同一字符串,则验证通过
利用公钥登录的关键是必须手动将客户端的公钥添加到服务端,比如GitHub便有这一步骤,添加了之后便可无密码登录。
参考文献:
图解SSH原理及两种登录方法的更多相关文章
- (转)图解SSH原理
图解SSH原理 原文:https://www.jianshu.com/p/33461b619d53 http://blog.51cto.com/forlinux/1352900---------SSH ...
- OpenGL坐标变换及其数学原理,两种摄像机交互模型(附源程序)
实验平台:win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): a.鼠标拖拽旋转物体,类似于OGRE中的“OgreBites::CameraStyle: ...
- 两种Ajax方法
两种Ajax方法 Ajax是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技 ...
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
史上最全的CSS hack方式一览 2013年09月28日 15:57:08 阅读数:175473 做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- git两种合并方法 比较merge和rebase
18:01 2015/11/18git两种合并方法 比较merge和rebase其实很简单,就是合并后每个commit提交的id记录的顺序而已注意:重要的是如果公司用了grrit,grrit不允许用m ...
- mysql in 的两种使用方法
简述MySQL 的in 的两种使用方法: 他们各自是在 in keyword后跟一张表(记录集).以及在in后面加上字符串集. 先讲后面跟着一张表的. 首先阐述三张表的结构: s(sno,sname. ...
- C#中的两种debug方法
这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹.利用宏定义两种方法,需要的朋友可以参考下 第一种:需要把调试方法改成debug代码用 #if DEBU ...
- Service的两种启动方法
刚才看到一个ppt,介绍service的两种启动方法以及两者之间的区别. startService 和 bindService startService被形容为我行我素,而bindService被形容 ...
随机推荐
- mysql之用户管理
本文内容: 用户的介绍 查看用户 创建用户帐户 修改账户 删除帐户 关于匿名用户 首发日期:2018-04-19 用户的介绍: mysql的客户端连接是以用户名来登录服务端. 服务端可以对用户的权限来 ...
- 如何在数据表当中找出被删掉的数据行ID
这个问题是一年前我刚步入IT行业的一个面试题,当时抓破头皮都想不到的问题,但现在回想过去自身不禁感到可笑,不多扯直接写解决方案.如何在数据表当中找出被删掉的数据行ID,意思是:在一堆的数据当中,让你找 ...
- centos开发环境安装的备忘
#Centos visudo运行普通用户$(whomai)执行sudo操作 http://www.cnblogs.com/xianyunhe/archive ...
- 洗礼灵魂,修炼python(67)--爬虫篇—cookielib之爬取需要账户登录验证的网站
学完前面的教程,相信你已经能爬取大部分的网站信息了,但是当你爬的网站多了,你应该会发现一个新问题,有的网站需要登录账户才能看到更多的信息对吧?那么这种网站怎么爬取呢?这些登录数据就是今天要说的——co ...
- Hibernate 5 入门指南-基于Envers
首先创建\META-INF\persistence.xml配置文件并做简单的配置 <persistence xmlns="http://java.sun.com/xml/ns/pers ...
- JavaScript数据类型之布尔类型
引言 布尔值指代真或假.开或关.是或否.这个类型只有两个值,保留字true和false.JavaScript程序中的比较语句的结果通常都是布尔值.布尔值通常用于JavaScript中的控制结构中. 真 ...
- qemu 虚拟机
http://blog.csdn.net/caspiansea/article/details/12986565
- HBase1.0.1.1 API与原来有所不同
package com.felix.hbaseapi_test; /* 这是旧版的 API操作 */ public class hbaseapifelix { public static final ...
- PostGIS中dbf file (.dbf) can not be opened.shapefile import failed
postgis数据库文件shapefile导入 dbf file (.dbf) can not be opened.shapefile import failed. Destination: publ ...
- 前端性能优化成神之路-HTTP压缩开启gzip
什么是HTTP压缩 HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法. HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件. 能大大减少 ...