一、简介

    SSH全名Secure Socket Shell,安全外壳传输协议。专为远程登录会话和其他网络服务提供安全性的协议

二、加密算法

  要了解SSH的原理,就要先知道目前主流的俩种加密算法

  2.1 对称加密

所谓对称加密,就是A使用123456密钥进行加密,B使用123456密钥进行解密。很容易理解,常用的对称加密算法:   DES,3DES,AES

  如下图所示:

  2.2 非对称加密

所谓非对称加密,就是A通过非对称加密算法产生了两个密钥:一个私钥,一个公钥。你用一个密钥加密的东西,必须用另外一个密钥解密。A通过私钥加密后的密文发送给B,B通过获取A的公钥进行解密。

私钥顾名思义,就是自己私有的密钥,不会传播的,存放在本地
公钥顾名思义,就是能在网络上传播的,也同时容易被截取的。 #以上存在一个单向安全问题:
只靠A产生的密钥对进行加解密,则交互流程是:
A向B发消息:A(A的私钥加密)-->internet--->B(A的公钥解密)
B向A发消息:B(A的公钥加密)-->internet-->A(A的私钥解密)
假如internet上非法这C获取了A的公钥,则C就能解密从A发过来的信息。而B通过公钥加密向A发送的消息,C手上只有公钥,无能无力。所以就存在了单向传输安全问题 #解决办法:
B也产生一对密钥(B的公钥和B的私钥)
可靠的双向传输方式:
A向B发消息:A(B的公钥加密)-->internet--->B(B的私钥解密)
B向A发消息:B(A的公钥加密)-->internet-->A(A的私钥解密)
总结:可靠传输,公钥加密,私钥解密

  可靠的非对称传输方式如图:

三、SSH原理

  SSH基于的是非对称加密

四、SSH两种认证方式

  4.1 用户名和密码认证

#交互流程
1.用户A向远程主机B发送登录请求
2.远程主机B把自己的公钥发送给用户A
3.用户A使用B的公钥,加密用户名和密码,发送给远程主机B验证
4.远程主机B用自己的私钥进行解密登录用户名和密码,如果密码正确,就同意用户登录

  用户名密码认证交互图

  4.2 公钥认证

1.用户A将自己的公钥储存在远程主机B上。
2.用户A向远程主机B发送登录请求
3.远程主机B用A的公钥加密一段随机字符串,发送给A
4.用户A用自己的私钥解密后,再将此字符串和sessionKey通过MD5生成摘要1,再发给远程主机B。
5.远程主机B将本地的随机字符串和session Key通过MD5生成摘要2,比对用户A发送过来的摘要A是否一致,如果一致,就证明用户是可信的,直接允许登录shell,不再要求密码。

  公钥认证交互图:

五、中间人攻击

SSH中间人攻击(Man-in-the-middle attack),只适用于SSH采用的是用户名密码认证的方式

  攻击原理:

1.截获了用户A的登录请求
2.冒充远程主机B,将伪造的公钥发给用户A
3.用户以为是真实的远程主机B,将用户和密码用非法远程主机C发来的公钥加密,发出
4.非法远程主机C用自己的私钥进行解密,从而获得登录真实远程主机的用户名和密码

  中间人攻击交互图:

  解决办法:

方法一:核对远程主机贴出的公钥指纹(见注释1)与自己本机第一次登陆显示的公钥指纹,是否一致。不一致则说明被劫持,禁止输入密码

方法二:采用密钥登陆

#注释1:公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹,如:4a:65:fb:c2:bb:11:19:c3:db:46:37:8a:95:78:34:da

六、SSH免密认证示例

  6.1  SSH免密登陆centos服务器

#在centos7 客户端配置:
1.客户端生成一对密钥对(私钥和公钥)----使用ssh-keygen工具
ssh-keygen #输入此命令,回车
Enter file in which to save the key (/root/.ssh/id_rsa): #直接回车,密钥对默认保存在当前用户/.ssh/下
Enter passphrase (empty for no passphrase): #是否要给密钥对设立密码,用于二次认证,一般皆为不需要,直接回车
Enter same passphrase again: #在此输入密码,不需要,直接回车 2.将客户端产生的公钥发送给远程服务器----使用ssh-copy-id工具
ssh-copy-id root@192.168.1.1
The authenticity of host '192.168.62.37 (192.168.62.37)' can't be established.
ECDSA key fingerprint is 4a:65:fb:c2:bb:11:19:c3:db:46:37:8a:95:78:34:da.
Are you sure you want to continue connecting (yes/no)? yes #选择yes,因为第一次登陆此远程主机,远程主机给客户端发送了他的公钥,保存在当前用户/root/.ssh/known_hosts 3.此时就可以免密登陆远程主机了
ssh root@192.168.1.1 #无需密码即可登录成功 #在centos7 服务端:
客户端主机传过来的公钥,一般保存在登录用户下,如root用户,/root/.ssh/authorized_keys文件里
关于authorized_keys文件里,第三列一般为客户端主机名,可有可无。即客户端主机更改了主机名,也不会影响到免密登录。第一列,ssh-rsa,与第二列客户端主机的公钥内容,不可缺少

  6.2 ssh免密登录思科cisco交换机

#此处客户端是centos7
#在centos7 客户端配置:
1.客户端生成一对密钥对(私钥和公钥)----使用ssh-keygen工具
ssh-keygen #输入此命令,回车
Enter file in which to save the key (/root/.ssh/id_rsa): #直接回车,密钥对默认保存在当前用户/.ssh/下
Enter passphrase (empty for no passphrase): #是否要给密钥对设立密码,用于二次认证,一般皆为不需要,直接回车
Enter same passphrase again: #在此输入密码,不需要,直接回车 2.将产生的公钥内容部分复制出来(不包含第一列ssh-rsa,和第三列客户主机名)
cat /root/.ssh/id_rsa.pub 3.完成以下服务端配置后,即可免密登录
ssh cisco@192.168.1.1 #服务端:思科cisco交换机配置
1.开启ssh服务:
ip domain-name TEST.LOCAL #设置域名,为了接下来生成密钥对
crypto key generate rsa modulus 2048 #生成密钥对
ip ssh version 2
line vty 0 4
transport input ssh
login local #以下俩条为可选,有些版本没有此命令
no ip ssh server authenticate user password #禁止用户名密码登录
no ip ssh server authenticate user keyboard 2.粘贴客户端的公钥内容
R1(config)#ip ssh pubkey-chain
R1(conf-ssh-pubkey)#username WINDOWS_USER #【重要】客户端密钥登录时,使用此用户名cisco登录
R1(conf-ssh-pubkey-user)#key-string
R1(conf-ssh-pubkey-data)#AAAAB3NzaC1yc2EAAAABJQAAAQEAijoMF9oBwyQxwYbVlFprz+fG8oe5uAcCxwMw
R1(conf-ssh-pubkey-data)#eIR1lyAnDJIsYbTbcdm+n5KiQnCt2561MpN4yOFpajFNM/dqH7/jYaqaicHCSV2F
R1(conf-ssh-pubkey-data)#RGauEp7FzN/uXxsX7mii6qOuxovl9OflLpXcvH5QH6551ycmL8nIv8UCY8uayiGI
R1(conf-ssh-pubkey-data)#INsC0LyKEctWDW6qWp43T7rhcP0y4JoMraTCZLIPNE0Bo0bHgnGLg6fEvJmyB3sX
R1(conf-ssh-pubkey-data)#H+7BaxHdYKg2OcIgVqYzclWhDwxj32kqd1BCq089iBMrb4QppDU2eM/t22iK29mn
R1(conf-ssh-pubkey-data)#eqOGTiCkxB80ix+KULT9okmqkj3TbhCpunTfuPCCRNrjqndBsw==
R1(conf-ssh-pubkey-data)#exit
R1(conf-ssh-pubkey-user)#exit
R1(conf-ssh-pubkey)#exit #ps1:在粘贴公钥内容的时候,不宜一次粘贴,cisco输入字符有长度限制,分多次少量粘贴
#ps2:通过密钥认证登录的用户cisco,他的权限级别,根据username cisco privilege 15 password cisco来决定
#ps3:一个用户cisco下可以设置多个公钥

SSH原理讲解与实践的更多相关文章

  1. ssh原理图解

    SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux系统的首选方式.在此之前,远程登录一般常用FTP和Telnet,但是它们以明文的形式在网络中传输账 ...

  2. 图解SSH原理

    1. 初见SSH SSH是一种协议标准,其目的是实现安全远程登录以及其它安全网络服务. SSH仅仅是一协议标准,其具体的实现有很多,既有开源实现的OpenSSH,也有商业实现方案.使用范围最广泛的当然 ...

  3. (转)图解SSH原理

    图解SSH原理 原文:https://www.jianshu.com/p/33461b619d53 http://blog.51cto.com/forlinux/1352900---------SSH ...

  4. LSTM和双向LSTM讲解及实践

    LSTM和双向LSTM讲解及实践 目录 RNN的长期依赖问题LSTM原理讲解双向LSTM原理讲解Keras实现LSTM和双向LSTM 一.RNN的长期依赖问题 在上篇文章中介绍的循环神经网络RNN在训 ...

  5. Redis深度历险——核心原理与应用实践

    高可用架构」的各位老铁们,你们好!你是否还记得上个月发布的文章中,有两篇深入讲解Redis的文章,分别是和,广大粉丝读者们对这两篇文章整体评价颇高.而我就是这两篇文章的原创作者「老钱」(钱文品),我是 ...

  6. 使用Keras进行深度学习:(七)GRU讲解及实践

    ####欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 介绍 GRU(Gated Recurrent Unit) ...

  7. 使用Keras进行深度学习:(六)LSTM和双向LSTM讲解及实践

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 介绍 长短期记忆(Long Short Term Memory, ...

  8. 使用Keras进行深度学习:(五)RNN和双向RNN讲解及实践

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 笔者:Ray 介绍 通过对前面文章的学习,对深度神经网络(DNN) ...

  9. Navicate 连接阿里云MySQL(两种方式及原理讲解)

    Navicate 连接阿里云(两种方式及原理讲解) 一.直连方式(通过3306端口) 1.概述 2. 环境准备 3.操作及讲解 二.使用SSH通道 1.概述 2.环境准备 3.操作及讲解 如果对你有帮 ...

随机推荐

  1. 洛谷 P1311 【选择客栈】

    枚举在那个咖啡店喝咖啡 想要计算咖啡店两侧同色的客栈的对数 枚举i求和(左边第i种颜色的个数*右边第i种颜色的个数) 前缀和+后缀和 f[i][j]f[i][j]f[i][j]表示到第i家客栈及之前颜 ...

  2. 一个测试文件与源文件位于不同模块时Jacoco覆盖率配置的例子

    问题描述: 我们有个多模块项目,由于种种原因(更常见的可能是需要集成测试)测试文件和源文件不在一个模块,Jacoco的覆盖率无法正确显示,查询了一些资料,发现中文的例子比较少,就把我自己的Demo贴一 ...

  3. InstantiationException:mybatis.spring.transaction.SpringManagedTransactionFactory

    问题表现 Error creating bean with name 'sqlSessionFactory' Invocation of init method failed; nested exce ...

  4. TensorFlow笔记-文件读取

    小数量数据读取 这些只用于可以完全加载到内存中的小型数据集: 1,储存在常数中 2,储存在变量中,初始化后,永远不改变它的值 使用常量 training_data = ... training_lab ...

  5. Java学习笔记之---Servlet

    Java学习笔记之---Servlet (一)如何实现Servlet 1.实现javax.servlet.Servlet接口: 2.继承javax.servlet.GenericServlet类: 3 ...

  6. C#编程.面向对象编程.可删除对象(Using{})

    Using关键字可以在代码块中初始化使用重要资源的对象,Dispose()方法会在这个代码块的末尾自动调用,用法如下: <ClassName> <VariableName> = ...

  7. python课堂整理19----迭代器和生成器

    一.概念 • 迭代器协议: 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个stopIteration异常,以终止迭代(只能往后走,不能往前退) • 协议是一种约定,pyt ...

  8. java - tcp如何保证传输的可靠性和有序性

    TCP提供的是一种面向连接的,可靠性的字节流服务. 可靠性: 1.应用数据被TCP划分为最适合发送的数据包: 2.在TCP发送一个数据块后,将启动一个定时器,用以接收目的端的确认信息,若不能及时得到确 ...

  9. JDK容器类Map源码解读

    java.util.Map接口是JDK1.2开始提供的一个基于键值对的散列表接口,其设计的初衷是为了替换JDK1.0中的java.util.Dictionary抽象类.Dictionary是JDK最初 ...

  10. python基础学习(起步)

    目录 python基础学习(起步) 变量 常量 变量的内存管理 python垃圾回收机制 变量的其他赋值方式 今日编程小题 本人能力有限,若有偏颇之处请读者大大不吝赐教! 祝大家每天都在成长! pyt ...