SSH(Secure Shell)是一套协议标准,能够用来实现两台机器之间的安全登陆以及安全的数据传送,其保证数据安全的原理是非对称加密。html
传统的对称加密使用的是一套秘钥,数据的加密以及解密用的都是这一套秘钥,可想而知全部的客户端以及服务端都须要保存这套秘钥,泄露的风险很高,而一旦秘钥便泄露便保证不了数据安全。算法
非对称加密解决的就是这个问题,它包含两套秘钥 - 公钥以及 私钥,其中公钥用来加密,私钥用来解密,而且经过公钥计算不出私钥,所以私钥谨慎保存在服务端,而公钥能够随便传递,即便泄露也无风险。安全
保证SSH安全性的方法,简单来讲就是客户端和服务端各自生成一套私钥和公钥,而且互相交换公钥,这样每一条发出的数据均可以用对方的公钥来加密,对方收到后再用本身的私钥来解密。服务器
连接建立并发
由上一张图能够看出来,两台机器除了各自的一套公、私钥以外,还保存了对方的公钥,所以必然存在一个交换各自公钥的步骤。实际上并非简单的各自发送公钥,而是存在一些专门的算法。这一步在首次连接时、数据传送以前发生。ssh
客户端发起连接请求,服务端返回本身的公钥,以及一个会话ID(这一步客户端获得服务端公钥),客户端生成密钥对,客户端用本身的公钥异或会话ID,计算出一个值,并用服务端的公钥加密,客户端发送加密后的值到服务端,服务端用私钥解密,服务端用解密后的值异或会话ID,计算出客户端的公钥(这一步服务端获得客户端公钥)。编码
至此,双方各自持有三个秘钥,分别为本身的一对公、私钥,以及对方的公钥,以后的全部通信都会被加密
这里有一个有趣的地方,两台机器第一次使用SSH连接时,当服务端返回本身的公钥(第2步)的时候,客户端会有一条信息提示,大意是没法验证对方是否可信,并给出对方公钥的MD5编码值,问是否肯定要创建连接。加密
这是由于SSH虽然传输过程当中很安全,可是在首次创建连接时并无办法知道发来的公钥是否真的来自本身请求的服务器,若是有人在客户端请求服务器后拦截了请求,并返回本身的公钥冒充服务器,这时候若是连接创建,那么全部的数据就都能被攻击者用本身的私钥解密了。这也就是所谓的中间人攻击。htm
利用密码登陆blog
SSH还经常使用来远程登陆到别的机器,有两种经常使用的方法,第一种即是帐号密码登陆。服务端收到登陆请求后,首先互换秘钥,详细步骤如上一节所述。客户端用服务端的公钥加密帐号密码并发送,服务端用本身的秘钥解密后获得帐号密码,而后进行验证,服务端用客户端的公钥加密验证结果并返回,服务端用本身的秘钥解密后获得验证结果。
利用公钥登陆
有些时候并非开发者手动去链接服务器,而是客户端的程序须要链接到服务器,这时候用密码登陆就比较不方便,一是须要处理输入密码的问题,二是须要想办法安全的储存密码到程序里,这种状况下即可以利用公钥来进行无密码登陆。
客户端用户必须手动地将本身的公钥添加到服务器一个名叫authorized_keys的文件里,顾名思义,这个文件保存了全部能够远程登陆的机器的公钥。客户端发起登陆请求,而且发送一个本身公钥的指纹(具备惟一性,但不是公钥),服务端根据指纹检测此公钥是否保存在authorized_keys中,若存在,服务端便生成一段随机字符串,而后利用客户端公钥加密并返回,客户端收到后用本身的私钥解密,再利用服务端公钥加密后发回,服务端收到后用本身的私钥解密,若是为同一字符串,则验证经过,利用公钥登陆的关键是必须手动将客户端的公钥添加到服务端,好比GitHub便有这一步骤,添加了以后即可无密码登陆。
参考文献:
SSH登陆认证详解(详解(https://www.cdxy.me/?p=394)Intro to SSH and SSH Keys(ys(https://www.youtube.com/watch?v=mF6J-VQHPxA)图解SSH(SH(https://www.jianshu.com/p/33461b619d53)SSH原理与运用(运用(http://www.ruanyifeng.com/blog/2011/12/sshremotelogin.html)