SSH、SSL与HTTPS

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

关于加密

在解释SSH、SSL与HTTPS协议之前我先介绍一下非对称加密协议。在1976年以前,所有的加密都采用对称加密,既A使用某种加密规则对信息加密,B收到信息后逆向加密规则解密数据。这通信方式产生了一个难以解决的问题:A如何安全的把加密规则通知B?

在1976年有两位数学家提出了一个崭新的非对加密的概念:


1.A生成一对两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
2.B获取乙方的公钥,然后用它对信息加密。
3.A得到加密后的信息,用私钥解密。

受这个思路的启发,三位数学家Rivest、Shamir 和 Adleman 设计了一种具体实现上面描述的非对称加密的算法,以他们三个人的名字命名,就是目前在计算机领域应用非常广泛的非对称加密算法RSA加密算法。这样网络上传输的数据都经过公钥加密,然后用私钥解密,就算被第三方截获也无法解密出原始数据。想深入理解非对称加密解密的原理可以看这里。

虽然非对称加密很安全很强大,但是它也有缺点,相对于对称加密它计算量更大,计算时间更长。所以在大规模数据的安全通信场景中,普遍采用非对称加密技术来交换对称加密密钥,之后的通信都采用对称加密技术加密。

SSH

维基百科中对SSH协议的定义如下

Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定;SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。
传统的网络服务程序,如rsh、FTP、POP和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。
而SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
SSH之另一项优点为其传输的数据可以是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。

相信大家看了上面的段定义也是云里雾里。用最通俗的方式来解释一下SSH。有这么一个场景:有一个服务器在互联网的另一头,你需要远程登录到服务器来执行一些命令配置这台服务器。这个时候你和服务器之间就需要有数据通信。假设客户端叫A,服务器叫B。

要实现通信,最简单的想法就是,客户端服务器之间建立一个TCP连接,这样你的指令就可以通过TCP连接从A传输到B。再仔细想想,不对,A与B之间需要通信的数据中间经过了C、D、E、F等网络路由器设备,这其中任何一个路由器被黑客攻破,你们之间的通信数据就毫无保留的被别人看到。

所以,你需要用一个密钥把数据加密吧。这样A和B之间的数据就算被第三方看到,他们也不知道内容是什么。可是这里又存在一个问题,A如何通知B(或者B如何通知A)它的密钥是什么呢?要知道只要数据是在互联网上传输,就有被截获的可能。密钥被截获了,你就没有秘密可言了。

现在我们需要考虑一个安全的方式来传输密钥!让我想想——非对称加密!

  1. A、B之间建立TCP连接
  2. B生成一对公私密钥
  3. B把公钥发送给A
  4. A生成一个用于加密数据的密钥K(既我们想通知给客户端的密钥,之后的数据通信都使用这个密钥加密,这个密钥不可让第三方知道)
  5. A把K用公钥加密发送给B,B解密后,从此A、B之间的通信数据都用K密钥进行加密和解密。

这样假如中间的C、D、E截获了A发给B的K密钥内容的数据包,可是这个密钥是用B服务器生成的公钥加密过的,只有B服务器知道如何解密。于是我们的数据很安全了。。。

看起来很简单不是吗?一切大功告成。等等...如果黑客H埋伏在了A和B之间的某一个路由器上,他假冒B生成一对公私密钥,然后把公钥发送给A,这样A与H之间就建成了一个加密通道,A把所有信息发送给H,H截获A的信息,在假冒A与B通信。如此一来,A、B之间的通信就完全暴漏给了H,而A、B却完全不知道,这就是有名的“中间人”攻击。

为解决这个问题,SSH协议采用由人工判断公钥的fingerprint是否可信的方式。当使用ssh命令连接服务器时,命令行会提示如下信息:

The authenticity of host '168.30.9.213 (<no hostip for proxy command>)' can't be established.
RSA key fingerprint is 23:42:c1:e4:3f:d2:cc:37:1d:89:cb:e7:5d:be:5d:53.
Are you sure you want to continue connecting (yes/no)? 

输入yes之后才会连接到远程服务器,同时这个信息会存储到用户的.ssh/known_hosts文件中,下次再登录的时候,会检查known_host文件,如果存在相同的公钥信息,就不在提示用户确认了。

这种认证方式假设想登陆服务器的用户已经知道服务器公钥(作为服务器的用户他自然有渠道得知服务器公钥)。fingerprint其实就代表公钥,可以看成是公钥的一个压缩版。有了这个步骤,如果有中间人想冒充服务器B发送公钥给A,它不可能生成一对和B生成的一样的公私密钥,他发送给A的公钥必然与B服务器的不同,所以用户就可以根据printfinger判断所连接的服务器是否可信,有没有被中间人冒充。

SSH的实现细节

上面只是粗略讲解SSH的安全协议的设计思路,实际上SSH通信协议在安全通信过程中分了几个阶段,每个阶段又细分了几个步骤,具体的可参看SSH原理简介。几个主要阶段如下:

  • 协议协商阶段
  • 服务端认证阶段
  • 客户端认证阶段
  • 数据传输阶段

客户端认证

这里我想单独谈谈客户端认证,因为对于使用linux远程登录功能的系统管理员来说能有直观感觉的也就是是这个环节了。一般我们能接触到的的认证方式有两种:

  • 密码认证
  • Public Key认证

密码认证很好理解,就是我们在登录远程linux服务器的时候提供用户名和密码?这里面稍微提示一下,在你的用户名和密码通过网络传输给服务器之前,已经经过了服务器认证协商阶段,这是一个安全的加密信道已经建立,所以你的用户名和密码都是加密后传输给服务器的,保证不会被第三方截获。

每次登录都要输入密码很麻烦,且密码如果简单的话可能还会被暴力破解。Public Key认证提供了一种更安全便捷的认证客户端的方式。这个技术也用到了非对称加密技术,由客户端生成公私密钥对,然后将公钥保存在服务器上。认证的过程大体如下:

  1. 客户端发起一个Public Key的认证请求,并发送RSA Key的模数作为标识符。(如果想深入了解RSA Key详细 -->维基百科)
  2. 服务端检查是否存在请求帐号的公钥(Linux中存储在~/.ssh/authorized_keys文件中),以及其拥有的访问权限。如果没有则断开连接
  3. 服务端使用对应的公钥对一个随机的256位的字符串进行加密,并发送给客户端
  4. 客户端使用私钥对字符串进行解密,并将其结合session id生成一个MD5值发送给服务端。*结合session id的目的是为了避免攻击者采用重放攻击(replay attack)。
  5. 服务端采用同样的方式生成MD5值与客户端返回的MD5值进行比较,完成对客户端的认证。

为更广大群众设计的SSL与TLS

上面wiki上也有写,SSH其实是专门为shell设计的一种通信协议,它垮了两个网络层(传输层和应用层)。通俗点讲就是只有SSH客户端,和SSH服务器端之间的通信才能使用这个协议,其他软件服务无法使用它。但是其实我们非常需要一个通用的,建立在应用层之下的一个传输层安全协议,它的目标是建立一种对上层应用协议透明的,不管是HTTP、FTP、还是电子邮件协议或其他任何应用层协议都可以依赖的底层的可安全通信的传输层协议。

网景公司于1994年为解决上面的问题,设计了SSL(Secure Sockets Layer)协议的1.0版本,但并未发布,直到1996年发布SSL3.0之后,开始大规模应用于互联网服务。可能很多人听所过TLS(Transport Layer Security)。它相当于是SSL协议的一个后续版本,他是SSL经过IETF标准化之后的产物(详细参考传输层安全协议,下文中所说的SSL协议也包括TSL)。

跟SSH相比SSL所面临的问题要更复杂一些,上面我们提到,SSH协议通过人工鉴别Public Key的printfinger来判断与之通信的服务器是否可信(不是伪装的中间人)。可是SSL是为了整个互联网上的所有客户端与服务器之间通信而设计的,他们彼此之间不可能自己判断通信的对方是否可信。那么如何解决这个问题呢?

在构思解决方案之前我先讲一个概念数字签名。。。。

想了一下,还是不写了。。。 阮老师的这篇blog对数字签名解释的非常到位,良心推荐,如果有不了解数字签名概念的读者,建议先看看阮老师的文章。

回到上面我们所要解决的问题,以浏览器和网站服务器之前的安全通信举例,首先浏览器要求和某WEB服务器建立安全的SSL连接通道,这时需要服务器的公钥用来加密浏览器生成的通信密钥,发给WEB服务器,以确定通信密钥。假如浏览器接受到一个公钥,它如何知道这个公钥确实是来自那个WEB服务器,而不是中间的某个攻击者截获了它的请求,假扮WEB服务器给它的假密钥?浏览器总不能记录所有可信任站点的公钥吧。

解决问题的思路是这样的,在SSL协议中引入了一种类似公共机关(类似于我国的国家公证处?)的概念,就是我们熟知的CA(数字证书认证机构)。它为浏览器发行一个叫数字证书的东西。这个东西大体上如下图所示,其中比较重要的信息有:

  • 对象的公开密钥
  • 数字签名

有了数字证书,浏览器在建立SSL连接之前,并不只是简单获取服务器的公钥,而从服务器获取数字证书。数字证书里有服务器的公钥,并且有CA给这个证书签发的签名。这个签名其实是证书内容的摘要经过CA私钥加密生成的。这样浏览器得证书内容和摘要,并用CA的公钥(每个浏览器都存储着一些权威CA的公钥)对数字签名解密,也得到证书的摘要,比对两个摘要如果相同,说明证书是真的,且未经过修改。信任问题就这么解决了,如果上面这段话不好理解的话,再次建议读一读阮老师的数字签名是什么?。

 

原文见:https://www.jianshu.com/p/5e3f9dfd2cb4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北向资金运作akshare

import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline from pylab import mpl mpl.rcParams[font.sans-serif][SimHei] mpl.rcParams[axes.unicode_minus]False#获取交易日历 import datetime def get_cal_date(start,end):dates ak.to…

网络性能测试工具iperf详细使用图文教程【转载】

原文&#xff1a;https://www.cnblogs.com/yingsong/p/5682080.html 转载于:https://www.cnblogs.com/luo30zhao/p/10512042.html

代码审查:程序员内炼之道

摘要&#xff1a;“关注并弄清楚桥梁修建细节&#xff0c;否则你建起来的桥梁有可能坍塌。”代码审查更重要的是一种技术分享或者代码共享。程序员如何提升自我修炼之道&#xff0c;欢迎来支招。 代码审查更重要的是一种技术分享或者代码共享。在审查过程中&#xff0c;通过被…

扎实的基础是成功的法宝

转载链接&#xff1a;https://baijiahao.baidu.com/s?id1610187127874738836&wfrspider&forpc好基础是好成绩的根本,无论做任何事情,基本功的训练是成功的前提:“还没有学会走,就想学跑,那不行,肯定会摔跟头。”这是成功人士的经验之谈。要建成高楼大厦,地基必须打好。…

发送qq邮件

import smtplib from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication# 写成了一个通用的函数接口&#xff0c;想直接用的话&#xff0c;把参数…

排序代码(python,c++) 及 基本算法复杂度

0.导语 本节为手撕代码系列之第一弹&#xff0c;主要来手撕排序算法&#xff0c;主要包括以下几大排序算法&#xff1a; 直接插入排序 冒泡排序 选择排序 快速排序 希尔排序 堆排序 归并排序 1.直接插入排序 【算法思想】 每一步将一个待排序的记录&#xff0c;插入到前面…

TCP/IP四层模型与OSI参考模型

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 TCP/IP四层模型&#xff1a; 1.链路层&#xff08;数据链路层/网络接口层&#xff09;&#xff1a;包括操作系统中的设备驱动程序、计算…

Metal日记:使用步骤指南

本文参考资料&#xff1a; juejin.im/post/5b1e8f… xiaozhuanlan.com/topic/04598… developer.apple.com/videos/play… github.com/quinn0809/G… cloud.tencent.com/developer/a… devstreaming-cdn.apple.com/videos/wwdc… Metal处理逻辑 无论是CoreImage、GPUImage框架&…

还驾驭不了4核? 别人已模拟出百万核心上的并行

摘要&#xff1a;不管是台式机还是笔记本&#xff0c;四核双核都已经不是新鲜的事了。计算机领域的你可能已经认识到了给电脑选配4核的处理器完全是一种浪费&#xff0c;因为大多数的程序都不支持多核心的并行处理。然而斯坦福的计算机科学家最近公布&#xff0c;他们已经模拟出…

docker安装并运行ubuntu

拉取镜像 docker pull dorowu/ubuntu-desktop-lxde-vnc 运行容器&#xff1a; docker run -p 6080:80 dorowu/ubuntu-desktop-lxde-vnc 之后就可以http://localhost:6080/

Django内置权限扩展案例

当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统&#xff0c;Django内置权限系统基于model层做控制&#xff0c;新的model创建后会默认新建三个权限&#xff0c;分别为&#xff1a;add、change、delete&#xff0c;如果给…

Java 从入门到高级学习路线

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Java 从入门到高级学习路线《一》1.Jvm 部分Jvm 内存模型、Jvm 内存结构、Jvm 参数调优、Java 垃圾回收《二》Java 基础部分1.必须会使用…

Flutter Mac iOS 环境配置

官方文档&#xff1a;flutter.io/docs/get-st… 1.需要的命令行工具 bash curl git 2.x mkdir rm unzip which 2.SDK下载地址 flutter_macos_v1.0.0-stable.zip storage.googleapis.com/flutter_inf… 3.解压Flutter SDK cd ~/Flutter/SDK $ unzip ~/Downloads/flutter_macos_v…

多线程研究1

单线程&#xff1a; from urllib.request import urlretrieve import time import random starttime.time() fopen(E:\Python\py\web\hh.txt,r)#打开存放URL的文件 af.readlines() f.close() for i in a:brandom.randint(0,30)urlretrieve(i,%d.png%b) endtime.time() print(…

android viewpage预加载和懒加载问题

1、本人理解懒加载和预加载问题某种情况下可以归结为一类问题&#xff0c;下面我就说一下我遇到的预加载问题和懒加载问题及解决的相应方法&#xff1a; - [1 ] 预加载问题 描述&#xff1a;我用到了三个fragment、viewpage及tablayout实现点击切换、滑动切换。 …

大数据,且行且思

“大数据”概念于20世纪90年代被提出&#xff0c;最初只是对一些在一定时间内无法用传统方法进行抓取、管理和处理的数据的统称。随着时间的推移和科技的发展以及物联网、移动互联网、SNS的兴起&#xff0c;每年产生的数据量都以几何级数增长&#xff0c;《IDC Digital Univers…

IntelliJ IDEA中新建JAVA WEB项目、maven项目

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在IntelliJ IDEA 中新建一个Web应用项目。 1、 在主界面顶部菜单栏依次“File”-"New"-"Project..." 2、在对话框中…

S/4HANA业务角色概览之订单到收款篇

2019独角兽企业重金招聘Python工程师标准>>> 大家好我叫Sean Zhang&#xff0c;中文名张正永。目前在S/4HANA产品研发部门任职产品经理&#xff0c;而这一阶段要从2017年算起&#xff0c;而在那之前接触更多还是技术类的&#xff0c;比如做过iOS、HANA、ABAP、UI5等…

掘金量化的一个代码,对本人写策略避免入坑有重要意义

# codingutf-8from __future__ import print_function, absolute_import, unicode_literalsfrom gm.api import *import numpy as npdef init(context):# 选择的两个合约context.symbol [DCE.j1901, DCE.jm1901]# 订阅历史数据subscribe(symbolscontext.symbol,frequency1d,co…

C++ STL学习笔记

C STL学习笔记一 为何要学习STL&#xff1a; 数据结构与算法是编程的核心&#xff0c;STL中包含各种数据结构和优秀的算法&#xff0c;确实值得深入学习&#xff0c;本文中虽然着重使用&#xff0c;但希望有心的朋友能多看看相关数据结构的实现&#xff0c;对于C语言确实会有较…