SSH原理及两种登录方法图文详解
作者:Decouple 发布时间:2023-11-14 11:10:53
SSH(Secure Shell)是一套协议标准,可以用来实现两台机器之间的安全登录以及安全的数据传送,其保证数据安全的原理是非对称加密。
传统的对称加密使用的是一套秘钥,数据的加密以及解密用的都是这一套秘钥,可想而知所有的客户端以及服务端都需要保存这套秘钥,泄露的风险很高,而一旦秘钥便泄露便保证不了数据安全。
非对称加密解决的就是这个问题,它包含两套秘钥 - 公钥
以及私钥
,其中公钥用来加密,私钥用来解密,并且通过公钥计算不出私钥,因此私钥谨慎保存在服务端,而公钥可以随便传递,即使泄露也无风险。
保证SSH安全性的方法,简单来说就是客户端和服务端各自生成一套私钥和公钥,并且互相交换公钥,这样每一条发出的数据都可以用对方的公钥来加密,对方收到后再用自己的私钥来解密。
链接创建
由上一张图可以看出来,两台机器除了各自的一套公、私钥之外,还保存了对方的公钥,因此必然存在一个交换各自公钥的步骤。实际上并不是简单的各自发送公钥,而是存在一些专门的算法。这一步在首次链接时、数据传送之前发生。
客户端发起链接请求服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)客户端生成密钥对客户端用自己的公钥异或会话ID,计算出一个值,并用服务端的公钥加密客户端发送加密后的值到服务端,服务端用私钥解密服务端用解密后的值异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)至此,双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
这里有一个有趣的地方,两台机器第一次使用SSH链接时,当服务端返回自己的公钥(第2步)的时候,客户端会有一条信息提示,大意是无法验证对方是否可信,并给出对方公钥的MD5编码值,问是否确定要建立链接。
这是因为SSH虽然传输过程中很安全,但是在首次建立链接时并没有办法知道发来的公钥是否真的来自自己请求的服务器,如果有人在客户端请求服务器后拦截了请求,并返回自己的公钥冒充服务器,这时候如果链接建立,那么所有的数据就都能被攻击者用自己的私钥解密了。这也就是所谓的中间人攻击。
利用密码登录
SSH还常用来远程登录到别的机器,有两种常用的方法,第一种便是账号密码登录。
服务端收到登录请求后,首先互换秘钥,详细步骤如上一节所述。
客户端用服务端的公钥加密账号密码并发送
服务端用自己的秘钥解密后得到账号密码,然后进行验证
服务端用客户端的公钥加密验证结果并返回
服务端用自己的秘钥解密后得到验证结果
利用公钥登录
有些时候并不是开发者手动去连接服务器,而是客户端的程序需要连接到服务器,这时候用密码登录就比较不方便,一是需要处理输入密码的问题,二是需要想办法安全的储存密码到程序里,这种情况下便可以利用公钥来进行无密码登录。
客户端用户必须手动地将自己的公钥添加到服务器一个名叫authorized_keys的文件里,顾名思义,这个文件保存了所有可以远程登录的机器的公钥。客户端发起登录请求,并且发送一个自己公钥的指纹(具有唯一性,但不是公钥)服务端根据指纹检测此公钥是否保存在authorized_keys中若存在,服务端便生成一段随机字符串,然后利用客户端公钥加密并返回客户端收到后用自己的私钥解密,再利用服务端公钥加密后发回服务端收到后用自己的私钥解密,如果为同一字符串,则验证通过
利用公钥登录的关键是必须手动将客户端的公钥添加到服务端,比如GitHub便有这一步骤,添加了之后便可无密码登录。
参考文献:
SSH登录认证详解
Intro to SSH and SSH Keys
图解SSH
SSH原理与运用
总结
以上所述是小编给大家介绍的SSH原理及两种登录方法图文详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
来源:https://www.cnblogs.com/xz816111/p/9479139.html


猜你喜欢
- 本文实例讲述了C#实现日期格式转换的公共方法类。分享给大家供大家参考,具体如下:这里演示了C#中一些日期格式的转换。创建公共方法类(Util
- 本文为大家分享了类似微信朋友圈,点击+号图片,可以加图片功能,供大家参考,具体内容如下xml:<?xml version="
- Struts2 Action/动作动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架。每个URL将被映射
- 网上教程7.0大多数配置是这样compile ‘com.jakewharton:butterknife:7.0.1' ,不知道他们用
- 高并发下restTemplate的错误分析1. 问题现象和分析org.apache.http.conn.ConnectionPoolTime
- 本文实例为大家分享了SpringMVC实现上传下载文件的具体代码,供大家参考,具体内容如下一、SpringMVC专门提供了CommonsMu
- 在工作中,我们经常使用线程池,但是你真的了解线程池的原理吗?同时,线程池工作原理和底层实现原理也是面试经常问的考题,所以,今天我们一起聊聊线
- 本文实例为大家分享了Android实现左侧滑动菜单的具体代码,供大家参考,具体内容如下效果图:SlideActivity.java:pack
- package cn.hp.util;import java.sql.*;public class JDBCUtils { &
- CXF简介CXF是一个开源的WebService框架。Apache CXF = Celtix + XFire,开始叫 Apache Celt
- 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void通
- 本文实例为大家分享了unity实现翻页效果的具体代码,供大家参考,具体内容如下一、示意图二、步骤创建物体ToPanel;添加组件Scroll
- .NET中提供了读写Cookie的多种方法,Request.Cookies 是客户端通过 Cookie 标头形式由客户端传输到服务器的 Co
- 对于换肤技术,相信伙伴们都见过一些大型app,到了某些节日或者活动,e.g. 双十一、双十二、春节等等,app的ICON还有内部的页面主题背
- 首先来看一下效果: 大体思路如下: 总体布局用了一个自定义的ViewGroup,里面包了两个View(top Vie
- c++换行符有哪些\n 换行,光标移到下一行的开头;endl,把缓冲槽的内容输出到控制台;\r 回车,光标移到当前行的开头,不会换到下一行,
- IDEA 2020 源生是不支持中文的,感谢捷克工程师(可能是由国人实现)对我大天朝程序员的“照顾”,且不说这个必要性到底有多大,但从侧面体
- 本文为大家讲解了Struts2框架的入门知识,供大家参考,具体内容如下1、Struts2框架介绍Struts2框架是MVC流程框架,适合分层
- 众所周知在android7.0,修改了对私有存储的限制,导致在获取资源的时候,不能通过Uri.fromFile来获取uri了我们需要适配7.
- 观察者模式是软件设计模式中的一种,使用也比较普遍,尤其是在GUI编程中。关于设计模式的文章,网络上写的都比较多,而且很多文章写的也不错,虽然