SSH(Secure Shell)是一套协议标准,能够用来实现两台机器之间的安全登陆以及安全的数据传送,其保证数据安全的原理是非对称加密。html
传统的对称加密使用的是一套秘钥,数据的加密以及解密用的都是这一套秘钥,可想而知全部的客户端以及服务端都须要保存这套秘钥,泄露的风险很高,而一旦秘钥便泄露便保证不了数据安全。算法
非对称加密解决的就是这个问题,它包含两套秘钥 - 公钥
以及私钥
,其中公钥用来加密,私钥用来解密,而且经过公钥计算不出私钥,所以私钥谨慎保存在服务端,而公钥能够随便传递,即便泄露也无风险。安全
保证SSH安全性的方法,简单来讲就是客户端和服务端各自生成一套私钥和公钥,而且互相交换公钥,这样每一条发出的数据均可以用对方的公钥来加密,对方收到后再用本身的私钥来解密。服务器
由上一张图能够看出来,两台机器除了各自的一套公、私钥以外,还保存了对方的公钥,所以必然存在一个交换各自公钥的步骤。实际上并非简单的各自发送公钥,而是存在一些专门的算法。这一步在首次连接时、数据传送以前发生。并发
这里有一个有趣的地方,两台机器第一次使用SSH连接时,当服务端返回本身的公钥(第2步)的时候,客户端会有一条信息提示,大意是没法验证对方是否可信,并给出对方公钥的MD5编码值,问是否肯定要创建连接。ssh
这是由于SSH虽然传输过程当中很安全,可是在首次创建连接时并无办法知道发来的公钥是否真的来自本身请求的服务器,若是有人在客户端请求服务器后拦截了请求,并返回本身的公钥冒充服务器,这时候若是连接创建,那么全部的数据就都能被攻击者用本身的私钥解密了。这也就是所谓的中间人攻击。编码
SSH还经常使用来远程登陆到别的机器,有两种经常使用的方法,第一种即是帐号密码登陆。加密
有些时候并非开发者手动去链接服务器,而是客户端的程序须要链接到服务器,这时候用密码登陆就比较不方便,一是须要处理输入密码的问题,二是须要想办法安全的储存密码到程序里,这种状况下即可以利用公钥来进行无密码登陆。3d
利用公钥登陆的关键是必须手动将客户端的公钥添加到服务端,好比GitHub便有这一步骤,添加了以后即可无密码登陆。code
参考文献: