干货时刻
本文主要讲解了什么是SSH
以及SSH
协议口令验证登录和公钥登录等两种登录方式的原理,同时演示了如何用SSH
连接Github
。
SSH 是什么
SSH
的全称为Secure Shell
,即安全外壳协议。它是一种专为远程登陆会话和网络服务提供安全性的应用层协议。说白了就是用来连接服务器的一种方式。
在SSH
的加密原理中,就用到了非对称加密算法。在讲SSH
加密原理前,我们先溯本追源,了解一下加密算法和其中经典的非对称加密算法RSA
。
加密算法
计算机网络中的加密算法主要分为对称加密、非对称加密、散列算法等三种方式。
- 对称加密:加密和解密使用同一个密钥,例如
DES
、AES
、IDEA
、国密SM1/SM4
等等。 - 非对称加密:发送方用公钥对信息进行加密,接收方收到密文后,使用私钥进行解密,例如
RSA
、ECC
和国密SM2
- 散列算法:哈希加密系列算法,特点是不可逆、唯一性,例如
MD5
、SHA
、国密SM3
相比起对称加密,非对称加密的安全性更高,但加解密的效率也相对降低。
因此像HTTPS
的TLS1.2
握手协议就是采用了对称加密和非对称加密结合的方式进行密文数据传输。
RSA 非对称加密算法
RSA
加密算法是经典的非对称加密算法,其基本流程如下:
- 客户端在本地构建公钥和私钥,然后将公钥发送给服务器
- 服务器向客户端发送数据的时候用公钥进行加密,客户端收到数据后用私钥解密
- 客户端向服务器发送数据的时候用私钥进行加密,服务器收到数据后用公钥解密
缺点在于:如果公钥在传输中泄漏,则黑客可以用公钥破解客户端发送的数据。
SSH 加密原理
SSH
共有两种登录方式:
- 口令验证登录
- 服务器生成公钥和私钥
- 客户端发起连接请求,服务器将公钥发给客户端
- 客户端生成口令(服务器密码),并用服务器发来的公钥加密,发送给服务器
- 服务器通过私钥解密,拿到口令(服务器密码)
- 如果正确则认证成功
- 密钥验证登录
- 客户端生成公钥和私钥,将公钥提前部署在服务器上
- 客户端发起连接请求
- 服务器随机生成一个字符串,用本地的公钥加密,发送给客户端
- 客户端通过私钥解密,将解密后的字符串发送给服务器
- 服务器验证本地字符串和客户端发来的字符串的一致性,如果通过,则认证成功
SSH 远程登录 github
根据上节所述,第一步,我们首先要在客户端生成公钥和私钥。
随便找一个文件夹,右键菜单打开 git bash
,键入:
ssh-keygen -t rsa
其中,密钥交换算法选择rsa
。之后之后一路敲空格默认即可。
这时,我们可以在本地找到这两把密钥:私钥id_rsa
和公钥id_rsa.pub
。路径如下:
-
windows
:C:/Users/admin/.ssh
(不同电脑型号的用户文件夹地址不同,区别就在于admin
这个路径,我的是admin
,你的可能是ASUS、Lenovo、balabala
) -
mac/linux
:~/.ssh
第二步,我们要把公钥部署到github
上。
在bash
中键入:
cd ~/.ssh
ls
cat id_rsa.pub
如下图所示,我们可以拿到公钥的内容,复制下来。
接下来,进入我们的github
,点击右上角的个人头像,再进入settings
。
之后先点击SSH and GPG keys
,再点击New SSH key
新建一个SSH
公钥
如下图所示,将你复制好的公钥粘贴到 balabala
的位置,输入自定义的公钥名,点击Add SSH key
即可。
第三步,我们发起连接请求:
ssh -T git@github.com
其中git@github.com
相当于目标用户@目标主机
。
第一次连接通常会弹出来下面这句话:
Are you sure you want to continue connecting (yes/no/[fingerprint])?
我们键入yes
即可,之后就会弹出下图,表示登录成功。
总结与思考
- 口令验证:其实是将口令进行非对称加密,通信双方都基于这个口令进行后续操作,比如
SSH
登录中,口令就是服务器密码;再者,传统的TLS
握手(TLS 1.2
之前)是基于RSA
加密算法做密钥交换的,它的口令就是会话密钥。 - 密钥验证:它的前提条件是服务器需要有客户端的公钥,然后通过一次字符串的非对称加密实现免密码登录。
结束语
想要学习更多优质内容的同学,关注收藏一下作者的个人主页:东曜说 ~~