文章插图
1. 初见 SSH
SSH是一种协议标准,用于在网络主机之间进行加密的一种协议,其目的是实现安全远程登录以及其它安全网络服务 。
SSH 仅仅是一协议标准,其具体的实现有很多,既有开源实现的 OpenSSH,也有商业实现方案 。使用范围最广泛的当然是开源实现 OpenSSH 。为什么要搞这么个协议呢?其实,很久很久以前,互联网通信都是明文的,一旦在中间环节被某些中间商截获了,我们的通信内容就暴漏无疑 。
所以芬兰就有这么一位叫做 Tatu Ylonen 的人设计了 SSH 协议,将信息加密,这样就像上面说的,即使我们的登陆信息在中间被人截获了,我们的密码也不会被泄露 。
目前 SSH 协议已经在全世界广泛被使用,且已经在成为各个 linux 发行版的标配 。
2. SSH 工作原理
在讨论 SSH 的原理和使用前,我们需要分析一个问题:为什么需要 SSH?
从 1.1 节 SSH 的定义中可以看出,SSH 和 Telnet、FTP 等协议主要的区别在于安全性 。这就引出下一个问题:如何实现数据的安全呢?首先想到的实现方案肯定是对数据进行加密 。加密的方式主要有两种:
- 对称加密(也称为秘钥加密)
- 非对称加密(也称公钥加密)
文章插图
图1-1:对称加密-Client端
文章插图
图1-2:对称加密-Server端
对称加密的加密强度高,很难破解 。但是在实际应用过程中不得不面临一个棘手的问题:如何安全的保存密钥呢?
尤其是考虑到数量庞大的 Client 端,很难保证密钥不被泄露 。一旦一个 Client端的密钥被窃取,那么整个系统的安全性也就不复存在 。为了解决这个问题,非对称加密应运而生 。非对称加密有两个密钥:“公钥”和“私钥” 。
两个密钥的特性:公钥加密后的密文,只能通过对应的私钥进行解密 。而通过公钥推理出私钥的可能性微乎其微 。下面看下使用非对称加密方案的登录流程:
文章插图
图1-3:非对称加密登录流程
- 远程 Server 收到 Client 端用户 TopGun 的登录请求,Server 把自己的公钥发给用户 。
- Client 使用这个公钥,将密码进行加密 。
- Client 将加密的密码发送给 Server端 。
- 远程 Server 用自己的私钥,解密登录密码,然后验证其合法性 。
- 若验证结果,给 Client 相应的响应 。
私钥是 Server 端独有,这就保证了 Client 的登录信息即使在网络传输过程中被窃据,也没有私钥进行解密,保证了数据的安全性,这充分利用了非对称加密的特性 。这样就一定安全了吗?
上述流程会有一个问题:Client 端如何保证接受到的公钥就是目标 Server 端的?
如果一个攻击者中途拦截 Client 的登录请求,向其发送自己的公钥,Client 端用攻击者的公钥进行数据加密 。攻击者接收到加密信息后再用自己的私钥进行解密,不就窃取了 Client 的登录信息了吗?这就是所谓的中间人攻击 。
文章插图
图1-4:中间人攻击
2.1 SSH 中是如何解决这个问题的?
2.1.1 基于口令的认证
从上面的描述可以看出,问题就在于如何对 Server 的公钥进行认证?在 https中可以通过 CA 来进行公证,可是 SSH 的 Publish key和 Private key 都是自己生成的,没法公证 。
只能通过 Client 端自己对公钥进行确认 。通常在第一次登录的时候,系统会出现下面提示信息:
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 位的指纹,这样就方便比较了 。
推荐阅读
- 一文搞懂TCP/IP 协议栈原理
- 茶叶加工技术的茶叶烘焙工艺和原理介绍
- 扫把为啥能够立起来的原理 扫帚能立起来
- 触摸屏的工作原理
- 一文读懂MySQL的ACID原理
- 结构及工作原理详解 全自动洗衣机离合器
- QQ群排名技术原理揭秘!
- ECO模式是否真的能省油,它省油的原理是什么?
- 抽水马桶水箱结构图及工作原理
- 响应式网站设计的基本原理?