ssh是一个标准协议,用于保证网络通信安全服务,也就是加密,常见的应用场景就是安全登录,这个大家常用git的话应该比较熟悉,配置ssh后就可以不需要密码直接登录了,非常方便,那么ssh是怎样保证安全的呢。
加密是我们保证通信链路安全的最重要的方式,包括军用情报的传输,全部是由复杂的加密算法加持的,就是为了保证只有对的人才能读出正确的信息,林俊杰的歌词完美的说明了这个问题
确认过眼神,我遇上对的人。
对称加密
客户端对称加密过程
服务端对称加密过程
对称加密就是通信双方使用同样的密钥来加密数据,但是这样一来风险就比较大,客户端的数量都非常大,一旦任一客户端的密钥被泄露都会导致整个系统的数据传输被暴露,事情就大条了。那么解决这个问题的方式就是非对称加密。
非对称加密
非对称加密使用一个公钥和一个私钥来加密和解密数据,使用公钥加密的数据只能用对应的私钥解密,而且只有公钥是无法计算或者猜测出私钥的。
以一次登录为例,非对称加密的基本流程如下,
0、客户端发起明文登录请求
1、服务端将公钥发送给客户端
2、客户端使用公钥加密登录的账号密码等敏感数据
3、加密后的数据发送给服务端
4、服务端获取数据后,使用对应的私钥解密
5、校验数据合法性
6、返回登录结果
看起来很完美,万无一失?NO!NO!NO!
设想一下如下场景,有黑客大神搭建了一个假冒的服务器,拦截了你的明文请求,然后把自己的公钥发送给你,你傻乎乎的使用了这个公钥,然后把加密后的数据发送给了假冒的服务器,假冒的服务器下一步的动作当然是毫不客气的使用私钥解密你的数据,然后获取到了你的明文密码,换句话说,你的账号被盗了!
中间人攻击示意
如何防范中间人攻击呢?这就需要基于口令的认证,SSH的公钥和私钥都是自己生成的,没法公证。只能通过客户端自己对公钥进行确认。通常在第一次登录的时候,系统会出现下面提示信息
The authenticity of host 'ssh-server.example.com (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
需要我们自行确认服务端的RSA指纹,输入yes后提示
Warning: Permanently added 'ssh-server.example.com,12.18.429.21' (RSA) to the list of known hosts.
Password: (enter password)
接下来就是按照我们上述的流程走了。