在我刚刚学习开发和某大佬沟通時大佬说了一句话:把你的 SSH Key 给我。我的内心是这样的:
想问什么是 SSH又不敢问
打开 Google 之后大致明白了 SSH 是一种安全协议,于是先把 Key 梭出来干活但之后的一段时间对 SSH 只停留在使用阶段上,只知道有 Public Key 和 Private Key 这个机制具体它是如何保证安全的,却模模糊糊不清楚
每当使用 SSH 的时候我嘟在想:SSH 到底是如何保证安全的呢?既然 Public Key 加密的内容只有 Private Key 能解密那客户端发给服务端的消息怎么解密呢?最重要的是万一被人问倒了豈不是作为工程师的面子都没了?
现在就让我们一起开心地聊一聊 SSH 到底是怎么运作的先抛开大家经常讲的 Public/Private Key,我们从其他角度来看看 SSHSSH 的連接分为两步:
-
客户端和服务端建立连接
客户端和服务端建立连接
在这一大步中,又分为以下几小步:
-
客户端联系服务端双方沟通自己支持的 SSH 协议的版本,约定使用某个共同支持的版本
-
服务端将自己的 Host Key 、加密方法和其他一些参数发给客户端。
Host Key 由 SSH 自行生成不需要用户做什么。如果客户端通过 Host Key 发现从来没有连接过这台服务器会询问用户是否要继续连接,用户回答 yes 之后会在本地的 known_hosts 文件记录这台服务器下佽连接时客户端就不会再次询问。由于仅靠服务端下发 Host Key 的方法无法防范中间人攻击后来又出现了 Public Key Certificates,由一个可靠的第三方机构给服务端签發***从而确保了安全性。
(图片来源:维基百科)
-
客户端和服务端使用沟通时的信息协商加密算法以及一个双方都知道的数字。
-
双方各自生成只有自己才知道的 private 密码并使用上一步中的数字进行加密,再次生成密码
-
双方交换再次加密后的密码。
-
双方在对方发来的密碼基础上加上第二步自己的 private 密码再次加密。本次加密之后得到的结果就是在双方处都相同的 Session Key
从这个算法中,可以看出客户端和服务端沒有直接传输自己在第二步生成的密码而是通过加密互换再加密的方式来生成 Session Key,从而保障了 Session Key 无法被泄露
当客户端和服务端之间建立起加密链接后,进入到身份鉴权的步骤在身份鉴权这一步除了使用 Key 登录外,还能使用密码登录这里我们只讲 Key 方式的登录。
-
客户端用 Private Key 生成簽名向服务器发起登录请求
-
服务端验证签名,检查自己有没有和这个签名匹配的 Public Key如果有,则进入下一步
-
服务端生成一串随机字符串,用 Public Key 加密后发送给客户端
-
服务端使用同样的 MD5 hash 和 Session Key 计算这串字符的加密结果,并和客户端发来的结果做比对如果结果一样,则允许客户端登录
Key 的任务也就完成了。
SSH 完成连接在接下来的通讯过程中,双方将持续使用 Session Key 进行通讯
SSH 分为两大步,第一步是客户端和服务端建立连接最终生成双方都一致的 Session Key。第二步使用 Authorized Key 进行登录登录过程使用 Public/Private Key 验证身份。连接建立完成后在通讯过程中使用 Session Key 对信息进行加密解密。
LeanCloud领先的 BaaS 提供商,为移动开发提供强有力的后端支持更多内容请关注「LeanCloud 通讯」