图解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被形容 ...
随机推荐
- 上了IPD和CMMI,为什么还要搞敏捷?
文/资深顾问 杨学明 现在国内许多产品创新型企业一旦研发团队上了规模,就会进行IPD体系的变革或CMMI的认证,但现在还有一种更加流程的开发模式,就是敏捷,华为公司早在2009年正式发文在全公司现在流 ...
- 深圳共创力“研发管理&知识管理”高端研讨交流会在深圳举办!
2017/4/8,由深圳市共创力企业管理咨询公司举办的“研发管理&知识管理”高端研讨会在深圳市南山区圣淘沙国际酒店(翡翠店)隆重召开.此次研讨会由共创力总经理.首席顾问杨学明先生主持.研讨会先 ...
- c/c++ allocator 使用
allocator 使用 作用:只开辟空间,不调用构造函数 操作一览表 allocator<T> a 定义一个名为a的allocator对象,它可以为类型为T的对象分配内存 a.alloc ...
- spyder 快捷键
本文主要介绍了spyder的快捷键. 常用快捷键 快捷键 中文名称 Ctrl+R 替换文本 Ctrl+1 单行注释,单次注释,双次取消注释 Ctrl+4 块注释,单次注释,双次取消注释 F5 运行 ...
- 讲解wpe抓包,封包
相信大多数朋友都是会使用WPE的,因为这里也有不少好的教程,大家都辛苦了!先说说接触WPE的情况.当时好像是2011年,我本来不知道WPE对游戏竟有如此大的辅助作用的.起先找WPE软件的时候,只是因为 ...
- 2802:小游戏利用bfs来实现
之前使用的是递归的方法来解决的问题,后来有点想用bfs(宽度优先搜索来尝试一下的想法,在网上看到有人使用了dfs(深度优先搜索)更加坚定了自己的这种想法. 这个方法首先是以顶点的四组开始,加入那些没有 ...
- SQLServer插入数据
使用数据库管理工具插入数据 打开数据库,选则要插入数据的表->右键点击->选择插入前200行->在右边视图中输入要插入的数据(如果字段设置为不为空,则必须输入,如果字段设置为可空,则 ...
- 【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
对于这个问题自己是比较清楚的,在分支比较多时,switch-case的效率肯定比if-else的要高许多,其原理类似于我们在优化某些程序时使用查表来代替算法计算一样. 如果想进一步深究的话,可以查看G ...
- 力扣算法题—060第K个排列
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132&qu ...
- 《Java大学教程》--第3章 迭代
迭代(iteration).重复(repetition):三种循环* for: 重复执行固定次数* while: 重复执行不固定次数* do...while: 比while至少多一次 1.答:P47迭 ...