做者:LeanCloud 工程师 毅然html
在我刚刚学习开发和某大佬沟通时,大佬说了一句话:把你的 SSH Key 给我。个人心里是这样的:算法
想问什么是 SSH,又不敢问安全
打开 Google 以后大体明白了 SSH 是一种安全协议,因而先把 Key 梭出来干活,但以后的一段时间对 SSH 只停留在使用阶段上,只知道有 Public Key 和 Private Key 这个机制,具体它是如何保证安全的,却模模糊糊不清楚。服务器
每当使用 SSH 的时候我都在想:SSH 究竟是如何保证安全的呢?既然 Public Key 加密的内容只有 Private Key 能解密,那客户端发给服务端的消息怎么解密呢?最重要的是,万一被人问倒了岂不是做为工程师的面子都没了?ide
如今就让咱们一块儿开心地聊一聊 SSH 究竟是怎么运做的。先抛开你们常常讲的 Public/Private Key,咱们从其余角度来看看 SSH。SSH 的链接分为两步:学习
在这一大步中,又分为如下几小步:ui
在这几步中,出现了两个 Key:Host Key 和 SessionKey。加密
Host Key 分为 Public 和 Private 两种。服务端拥有 Public Key 和 Private Key,并将 Public Key 发送给客户端。客户端用 Public Host Key 验证这台服务器确实是本身要链接的服务器后,双方使用 Diffie-Hellman 算法生成一致的 SessionKey。spa
Host Key 由 SSH 自行生成,不须要用户作什么。若是客户端经过 Host Key 发现历来没有链接过这台服务器,会询问用户是否要继续链接,用户回答 yes 以后会在本地的 known_hosts 文件记录这台服务器,下次链接时客户端就不会再次询问。因为仅靠服务端下发 Host Key 的方法没法防范中间人攻击,后来又出现了 Public Key Certificates,由一个可靠的第三方机构给服务端签发证书,从而确保了安全性。htm
Session Key 用于以后通信时对消息进行加密解密。这个 Session Key 的机制被称做对称加密(Symmetric Encryption),也就是两端使用的相同的 Key 来加密和解密信息。能够看出 SSH 信息的加密解密时并非用你们本身生成的 Public/ Private Key,而是用双方都一致的 Session Key。
生成 Session Key 的步骤大体以下:
(图片来源:维基百科)
从这个算法中,能够看出客户端和服务端没有直接传输本身在第二步生成的密码,而是经过加密互换再加密的方式来生成 Session Key,从而保障了 Session Key 没法被泄露。
当客户端和服务端之间创建起加密连接后,进入到身份鉴权的步骤。在身份鉴权这一步除了使用 Key 登陆外,还能使用密码登陆,这里咱们只讲 Key 方式的登陆。
工做中咱们在客户端生成的 Public/Private Key,就是指用来身份鉴权的 Authorized Key。客户端拥有 Private 和 Public Key,提早将 Public Key 放到服务端用于登陆。登陆时的具体步骤以下:
Public/Private Key 的加密方式被称做不对称加密(Asymmetry Encryption),就是说使用不一样的 Key 来对信息进行加密解密。客户端使用 Private Key 能够解密服务端使用 Public Key 加密的信息,服务端使用 Public Key 没法解密客户端使用 Private Key 发来的加密信息。登陆完成后,Authorized Key 的任务也就完成了。
SSH 完成链接,在接下来的通信过程当中,双方将持续使用 Session Key 进行通信。
SSH 分为两大步,第一步是客户端和服务端创建链接,最终生成双方都一致的 Session Key。第二步使用 Authorized Key 进行登陆,登陆过程使用 Public/Private Key 验证身份。链接创建完成后,在通信过程当中使用 Session Key 对信息进行加密解密。
参考资料