在了解SSH安全外壳协议之前,我们需要大致了解一下对称加密和非对称加密以及数字签名,推荐一篇很好的文章来理解什么是数字签名,文章中鲍勃扮演客户端,苏珊扮演服务端。
对称加密
是一种采用单钥密码系统加密的方法,即同一个密钥即可用做加密也可用作解密,也称之为单密钥加密。
常用的算法: MD5(消息摘要算法)、SHA(安全散列算法)
优点: 加密解密的速度比较快,适合长时间使用的数据。
缺点 : 加密解密都是使用同一密钥,机密性完全依赖于密钥,密钥的传输和保存存在安全问题,容易泄露、破解,当通信对象增多时密钥的管理也较麻烦。
非对称加密
需要有两个密钥来进行加密和解密,公钥(public key)、私钥(privare key),如果用公钥对数据进行加密,只有使用对应的私钥才能解密。如果用私钥对数据进行加密,则只能用公钥才能将数据解密。加密和解密需要使用不同的密钥。
常用的算法: RSA、DSA
优点: 与对称加密相比,其安全性更好。
缺点 : 加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
SSH(Secure Shell)安全外壳协议
什么是SSH ?
- 充分利用了对称加密、非对称加密来实现计算机之间的加密登陆和安全数据传输。
- SSH是建立在应用层基础上的安全协议,专为远程登陆会话和其他网络服务提供安全性的协议。
主要特征
- 加密:避免数据泄露
- 通信的完整性:保证数据在传输过程中不会丢失、被篡改。
- 认证:识别数据发送者、接受者身份,避免中间人攻击和重定向请求攻击。
主要阶段
协议协商阶段
- 服务端打开服务端口(默认22),等待客户端连接。
- 客户端发起TCP连接请求,并建立TCP连接,之后向客户端发送SSH协议版本信息。
- 客户端根据收到的版本信息决定将要使用的SSH版本,并向服务端发送。
- 服务端检查是否支持客户端决定使用的SSH版本。若支持,则双方完成协议协商,与客户端建立明文的通信通道进入服务端认证阶段,若版本不兼容,则双方都可断开连接。
服务端认证阶段
- 服务端向客户端发送以下内容:
- host key:用于认证服务端身份。
- server key: 用于帮助建立安全的数据传输通道。
- 8字节的随机数:客户端在下次响应中包含随机数,来防止IP欺诈。
- 服务端支持的压缩方式、加密算法、认证方式。
- 客户端在收到服务端发送的host key后会在本地的known host库(~/.ssh/known_host)文件中查找是否包含当前服务端发送的host key,如果有则下一步,如果没有则可以选择是否信任该服务端,或终止当前链接。
- 客户端需要向服务端发送session key(不可泄露)用于建立安全通信,出于性能考虑,SSH采用对称加密的方式,由当前的通信通道还是采用明文方式,需要用host key和server key(都为非对称加密)来对session key进行两次加密。
- 服务端收到session key后对其解密,完成安全通道的建立。在正式使用安全通道前客户端要求服务端再次使用session key加密的确认信息,以确认服务端身份。
- 服务端向客户端发送以下内容:
客户端认证阶段
安全通道已经成功建立,之后所有通信内容都是通过session key加密后进行传输。- password:即客户端提供用户名和密码,服务端通过用户名和密码对客户端身份进行认证。
- public key:基于非对称加密,客户端需要将生成的公钥储存在服务端,服务端用公钥将数据进行加密,客户端若能用私钥对其进行解密则可证明身份。
数据传输阶段
该阶段通过session key提供的加密算法,来保证通信过程中的数据安全。