关于SSH(Secure Shell)安全外壳协议

在了解SSH安全外壳协议之前,我们需要大致了解一下对称加密和非对称加密以及数字签名,推荐一篇很好的文章来理解什么是数字签名,文章中鲍勃扮演客户端,苏珊扮演服务端。

对称加密

是一种采用单钥密码系统加密的方法,即同一个密钥即可用做加密也可用作解密,也称之为单密钥加密。

常用的算法: MD5(消息摘要算法)、SHA(安全散列算法)
优点: 加密解密的速度比较快,适合长时间使用的数据。
缺点 : 加密解密都是使用同一密钥,机密性完全依赖于密钥,密钥的传输和保存存在安全问题,容易泄露、破解,当通信对象增多时密钥的管理也较麻烦。

非对称加密

需要有两个密钥来进行加密和解密,公钥(public key)、私钥(privare key),如果用公钥对数据进行加密,只有使用对应的私钥才能解密。如果用私钥对数据进行加密,则只能用公钥才能将数据解密。加密和解密需要使用不同的密钥。

常用的算法: RSA、DSA
优点: 与对称加密相比,其安全性更好。
缺点 : 加密和解密花费时间长、速度慢,只适合对少量数据进行加密。


SSH(Secure Shell)安全外壳协议

什么是SSH ?

  • 充分利用了对称加密、非对称加密来实现计算机之间的加密登陆和安全数据传输。
  • SSH是建立在应用层基础上的安全协议,专为远程登陆会话和其他网络服务提供安全性的协议。

主要特征

  • 加密:避免数据泄露
  • 通信的完整性:保证数据在传输过程中不会丢失、被篡改。
  • 认证:识别数据发送者、接受者身份,避免中间人攻击和重定向请求攻击。

主要阶段

  • 协议协商阶段
    1. 服务端打开服务端口(默认22),等待客户端连接。
    2. 客户端发起TCP连接请求,并建立TCP连接,之后向客户端发送SSH协议版本信息。
    3. 客户端根据收到的版本信息决定将要使用的SSH版本,并向服务端发送。
    4. 服务端检查是否支持客户端决定使用的SSH版本。若支持,则双方完成协议协商,与客户端建立明文的通信通道进入服务端认证阶段,若版本不兼容,则双方都可断开连接。
  • 服务端认证阶段
    1. 服务端向客户端发送以下内容:
      • host key:用于认证服务端身份。
      • server key: 用于帮助建立安全的数据传输通道。
      • 8字节的随机数:客户端在下次响应中包含随机数,来防止IP欺诈。
      • 服务端支持的压缩方式、加密算法、认证方式。
    2. 客户端在收到服务端发送的host key后会在本地的known host库(~/.ssh/known_host)文件中查找是否包含当前服务端发送的host key,如果有则下一步,如果没有则可以选择是否信任该服务端,或终止当前链接。
    3. 客户端需要向服务端发送session key(不可泄露)用于建立安全通信,出于性能考虑,SSH采用对称加密的方式,由当前的通信通道还是采用明文方式,需要用host key和server key(都为非对称加密)来对session key进行两次加密。
    4. 服务端收到session key后对其解密,完成安全通道的建立。在正式使用安全通道前客户端要求服务端再次使用session key加密的确认信息,以确认服务端身份。
  • 客户端认证阶段
    安全通道已经成功建立,之后所有通信内容都是通过session key加密后进行传输。
    1. password:即客户端提供用户名和密码,服务端通过用户名和密码对客户端身份进行认证。
    2. public key:基于非对称加密,客户端需要将生成的公钥储存在服务端,服务端用公钥将数据进行加密,客户端若能用私钥对其进行解密则可证明身份。
  • 数据传输阶段
    该阶段通过session key提供的加密算法,来保证通信过程中的数据安全。