ssh 远程链接的两种验证方式

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为创建在应用层基础上的安全协议。其目的是实现安全远程登陆以及其它安全网络服务算法

从客户端来看,SSH提供两种级别的安全验证。一种是基于口令的安全验证,另外一种是基于密钥的安全验证。分别看一下两种验证方式的过程。shell

1、基于口令的验证

1,客户端向服务端发起登陆请求:ssh username@hostname安全

2,服务端收到客户端的请求后,把本身的公钥发送给客户端;(服务端的公钥保存在/etc/ssh/*.pub里面)网络

3,当客户端第一次收到该服务端发送过来的公钥时,为了防止中间人攻击(发送公钥的主机不是服务端,而是拦截了客户端登陆请求的主机),客户端主机会有系统提示:并发

The authenticity of host 'ssh-server.example.com (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)? 
复制代码

上面的信息说的是:没法确认主机ssh-server.example.com(12.18.429.21)的真实性,不过知道它的公钥指纹,是否继续链接?之因此用fingerprint代替key,主要是key过于长(RSA算法生成的公钥有1024位),很难直接比较。因此,对公钥进行hash生成一个128位的指纹,这样就方便比较了。ssh

若是输入 yes 后,会出现以下信息:加密

Warning: Permanently added 'ssh-server.example.com,12.18.429.21' (RSA) to the list of known hosts. 
Password: (enter password) 
复制代码

该host已被确认,并被追加到文件 known_hosts 中,而后就须要输入密码。(当 known_hosts 存储了服务端的公钥以后,客户端后续链接该服务端就会比对存储在 known_hosts 文件里的公钥,从而确认是否为该服务端发来的公钥)spa

4,客户端输入密码,使用服务端发来的公钥进行加密,发送给服务端;code

5,服务端收到客户端的加密信息,使用本身的私钥进行解密比对,比对正确就给客户端响应。server

2、基于公钥验证

1,客户端将本身的公钥放到服务端的 authorized_keys 文件中;

2,客户端向服务端发起登陆请求:ssh username@hostname

3,服务端收到客户端的请求后,会在 authorized_keys 中匹配到客户端的公钥,并生成随机数 R,用客户端的公钥对该随机数进行加密,而后将加密信息发送到客户端;

4,客户端收到加密信息后用私钥进行解密,获得随机数 R,而后对随机数 R 和本次会话的 SessionKey 利用 md5 生成摘要 Digest1,发送给服务端;

5,服务端收到 Digest1 后,也会对随机数 R 和 SessionKey 利用一样的摘要算法生成 Digest2,而后对比 Digest1 和 Digest2 是否相同,完成认证过程。

3、一些补充说明

公钥和私钥到底哪一个是用来加密,哪一个是用来解密的,是否能够公钥加密私钥解密,同时也能够私钥加密公钥解密呢?

首先要明确两个问题:(1)既能够公钥加密私钥解密,也能够私钥加密公钥解密;(2)加密解密和签名验证是两个不一样的概念。

1, 先来讲加密解密:须要同时使用公钥和私钥的加密算法是非对称加密,最多见的即是RSA。

举例说明非对称加密:若是A想要给B秘密的发一条信息,只须要B建立一套公钥(盒子)和私钥(钥匙),盒子能够随意分发,可是钥匙只能B本身全部,当A想要给B发信息时,只须要把信息(纸条)经过B的公钥加密(放入盒子里锁上),再由B用私钥(钥匙)进行解密(打开盒子),便可获取A发送的信息。此时若是C想要截取信息,可是因为没有B的私钥,C即便拿到了信息也没法解密(只有盒子没有钥匙),从而保证了数据的安全性。 那么B是否能够经过私钥加密信息,而后由A使用公钥解密信息呢?从原理上讲,是能够的。 非对称密钥是能够用于双向加解密的。可是咱们为何不这么用呢,很好理解,由于所谓公钥,是公开的,不仅A一我的拥有,所以虽然A可以正常读取到信息,可是其余人也能够解密该条信息,从而没法保证信息的安全性。可是签名验证就不一样了。

2, 签名验证:用私钥进行签名,用公钥进行验证,从而保证信息来源是私钥拥有者。

举例说明:A想要让B确认某条信息是由本身发出的,先将本身的公钥发送给B,而后用本身的私钥对信息进行签名并发送给B(好比将字符串X用A的私钥加密生成Y,将X和Y以及信息都发送给B),B收到信息后用A的公钥对签名进行验证,用A的公钥解密Y获得Z,若是Z=X,则验证成功,说明信息是由A发布的。

相关文章
相关标签/搜索