SSH协议(从对称加密到非对称加密)

简介

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。简单来说ssh是一种加密的用于远程登录的协议。

对称加密

对称加密的原理非常简单,假如计算机A要发送一段文字给计算机B,但是又不想让别人知道,最简单的办法就是,使用一大段密码进行加密,让别人不知道什么意思,这里术语就叫密钥,然后加密过后的文字通过网络发送给计算机B之后,计算机B为了读懂这段文字,这时就需要之前的密钥进行解密,如下图:

然而这里存在一个问题,万一别人通过网络传输或者其他手段把密钥给截取了,就凉了,所以这里需要一个复杂一点的非对称加密。

非对称加密

既然把密钥传输给别人不安全,那我们就要避免这个问题,首先计算机A和计算机B,分别拥有两个东西,叫做公钥和私钥,这两个东西有什么用呢,简单来说这两个东西是配套来使用的,一段文字通过公钥加密后,需要通过私钥解密才能看到,公钥就像锁,而私钥就像钥匙,现在计算机A拥有一把锁和钥匙,计算机B也拥有一把锁和钥匙,需要注意的是这两个东西是配套使用的,也就是只有自己的钥匙能开自己的锁。然后我们需要怎么做呢,原理很简单,计算机A和计算机B把自己的公钥复制一份,发送给对对方,也就是交换公钥,需要加密数据的时候就用对方的公钥解密,然后发送给对方,然后对方就用自己的密钥解密。如下图:

注:梯形为客户端公钥和私钥,长方形为服务器端公钥和私钥

公钥交换过程

公钥的交换过程也略微有点复杂,我们先来看个图:

简单来讲一下这个过程
1.首先客户端建立一个连接
2.服务器端将自己的公钥还有一个会话的ID发回给客户端,现在客户端得到了服务器端的公钥
3.客户端把自己的公钥(客户端公钥)和会话ID做一个异或运算,得到一个结果,然后把结果用服务器端的公钥加密发给服务器端
4.服务器端拿到那串东西后,用自己的私钥(服务器端私钥)解密得到那个结果,然后再和会话ID做异或运算,这样服务器端也得到了客户端的公钥

基于口令的远程登录

Linux利用ssh远程登录,一般有两种方式,一种是需要密码的,一种是不需要输入密码的,现在我们先来讨论下利用前面的原理如何实现,先看下图:

如上图所示,客户端想登录到服务器端怎么办呢
1.先做一个公钥交换,具体过程像上面那样
2.不是需要输入密码吗,那我就先把密码用服务器端的公钥加密一波在发出去给服务器端
3.服务器端得到加密后的密码后用自己的私钥(服务器私钥)解密一波就知道是不是正确了,然后密码正不正确得搞个反馈回去,这个反馈呢服务器端用客户端的公钥加密一波,再发回去给客户端
4.客户端拿到这个加密后的反馈,就直接用自己的私钥(客户端私钥)解密一下就完事

免密登录

免密登录是怎么做的呢,我们先来看个图:

1.首先不必做公钥交换了,在登录请求之前我需要将客户端的公钥发给服务器端
2.现在客户端发起一个登录请求
3.服务器端怎么做呢,先随机生成一串东西,然后用客户端的公钥进行加密,发给客户端
4.客户端拿到这串解密后的东西后用自己的私钥(客户端私钥)解密一下,如无意外,会得到原来的字符串,然后再把这个解密后的字符串发给服务器端
5.服务器端拿到这串字符串后和自己之前生成的字符串比对一下,看是不是一样,一样的话就是自己人了,把登录反馈回去