一、简介

    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. form 利用BeginCollectionItem提交集合List<T>数据 以及提交的集合中含有集合的数据类型 如List<List<T>> 数据的解决方案

    例子: public class IssArgs { public List<IssTabArgs> Tabs { get; set; } } public class IssTabArg ...

  2. 【转载】 JAVA三层架构,持久层,业务层,表现层的理解

    JAVA三层架构,持久层,业务层,表现层的理解 转载:http://blog.csdn.net/ljf_study/article/details/64443653 SSH: Struts(表示层)+ ...

  3. 《C# 语言学习笔记》——定义属性

    属性定义的方式与字段类似,但包含的内容比较多. 属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值.这两个块也称访问器,分别用于get和set关键字定义,可以用于控制对属性的 ...

  4. Java简单公式计算器

    最近给公司开发业务代码时,碰到一个场景,简单描述是这样的: 客户要向咱们公司定制一件产品,这个产品呢,有很多属性,那公司得根据这些属性报价呀,怎么报价呢?公司针对某种类型的产品有一个基准价,在同类产品 ...

  5. EF Core懒人小技巧之拒绝DbSet

    前言 最近在项目中使用EF Core的频率越来越高,当项目比较大的时候,疯狂往DbContext中加各种DbSet,你会不会特难受?如果你是一键生成的大佬,那么请忽略本文.本文旨在不写 DbSet,那 ...

  6. Linux小火车和流星雨

    一.流星雨 [root@localhost ~]# wget https://jaist.dl.sourceforge.net/project/cmatrix/cmatrix/1.2a/cmatrix ...

  7. es6,@import一直报错 Can't resolve。。

    最近在项目中新增了一个按钮组的组件页面,但是在其他页面引入时,一直报错 引入方式:

  8. NPM - 检查并更新项目依赖的版本

    原文地址:https://acme.top/nodejs-npm-check-updates 前言 经常会遇到 package.json 中的库有更新,但是太多一个一个的来很费事,幸好有个工具 npm ...

  9. ansible-yum

    #yum 需要在vim /etc/ansible/hosts里面给执行的主机配置 远程调用python的路径不知道为什么默认值认识python2.6.6 vim /etc/ansible/hosts ...

  10. 最火的分布式 HTAP 数据库 TiDB - 入门实践教程

    偶然在某篇博客看到了 TiDB,一个融合 OLTP 和 OLAP 的分布式开源数据库, GitHub 上 Star 很多,然后 watch 了,发现 commit 和 pull request 一直都 ...