SSH是一种协议标准,它的主要目的是实现远程登录和提供安全网络服务 。它的实现有很多种,最常用的就是开源openssh 。
对称加密和非对称加密在讲解SSH实现原理之前,我们先来了解下加密方式,我们都知道为了数据的安全,数据在互联网上传输肯定是要加密 。那加密又要分为两种加密方式:
- 对称加密(秘钥加密)
- 非对称加密(公钥加密)
文章插图
服务端和客户端的交互过程如下图:
文章插图
对称加密的加密强度很高,但是这有一个很大的问题 。就是:如何保证秘钥A的安全?当客户端的数量非常大的时候,如何保证秘钥的安全?一旦秘钥泄漏出去,后果不堪设想 。用户的安全就没有任何保障 。所以非对称加密的出现就为了弥补这一点 。
非对称加密有两个秘钥:“私钥”和“公钥” 。公钥加密后的密文,只能通过对应的私钥进行解密 。而通过公钥推理出私钥的可能性微乎其微 。下图展示的是基本原理:
文章插图
上图在实际的使用中存在一个问题,就是客户端需要知道服务端的公钥,不然没法加密 。所以需要服务端告知客户端公钥的一个过程 。如下图:
文章插图
- 服务端收到客户端的登录请求,服务端把公钥发送给客户端
- 客户端用这个公钥,对密码加密
- 客户端将加密后的密码发送给服务端
- 服务端用私钥解密,验证OK
- 返回验证结果
你觉得这样就安全了吗?
上述图中有一个漏洞:客户端如何保证接受到的公钥就是目标服务端的?如果攻击者截获了客户端的请求,发送自己的公钥,那客户端用这个公钥加密的密码,就能被攻击者用自己的私钥解密 。这不是一个很大的漏洞吗?
SSH如何做的?SSH有两种方式:1. 基于口令的认证;2,基于公钥认证
1. 基于口令的认证
从上面可以知道,我们的主要要解决的是“如何对服务端的公钥进行验证”,客户端只要对公钥进行确认下就OK了 。通常在第一次登录的时候,系统会出现下面提示信息:
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位的指纹,这样就方便比较了 。
输入yes后,该host已被确认,并被追加到文件known_hosts中,然后就需要输入密码 。
2基于公钥认证
- 客户端与服务端协商产生会话密钥;
- 客户端会向服务端发送一个登录请求(如:root@192.168.1.2),发送的信息包括用户名root和root的公钥指纹,且所有信息都是通过会话密钥加密过的 。
- 服务端通过会话密钥解密客户端发送的数据得到请求登录的用户名root和root的公钥指纹,然后读取root用户家目录下的所有公钥数据(/root/.ssh/autorized_keys文件中),并分别通过单向加密算法获取各公钥的数据指纹与客户端发送过来的数据指纹做对比,从而找到客户端上的root用户的公钥;
- 服务端使用找到的客户端的公钥对一个随机数进行加密发送发送给客户端;
- 客户端使用私钥对服务端发送的随机数密文进行解密,然后把解密结果发送给服务端;
- 服务端验证客户端解密后的数据与自己发送的数据一致,则对客户端身份验证成功;
【5分钟理解SSH的工作原理】
推荐阅读
- 深入理解Java中方法的参数传递机制
- 营养师|腊肠和它是绝配,简单营养又好吃,5分钟上桌便宜鲜美,总吃不腻
- SSL和SSH有什么区别
- 递归与动态规划算法时间复杂度的简单理解
- 仅需 5 分钟,彻底理解 cookie、session、token
- 简单理解JavaScript,TypeScript和JSX
- 要做到相互理解和包容 人是相互的 婆媳之间
- 化妆|有颜就是任性,张柏芝化妆画了个寂寞?还是这5分钟懒人眼妆实用
- 深入理解TCP/IP协议
- 如何理解戒定慧三学 戒定慧三学