| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 什么是https(加密)协议,彻底搞懂https -> 正文阅读 |
|
[网络协议]什么是https(加密)协议,彻底搞懂https |
HTTPS(SSL/TLS)是计算机网络的知识,主要用来对HTTP协议传输的文本进行加密,提高安全性的一种协议。 因为HTTP是明文传输,所以会很有可能产生中间人攻击(获取并篡改传输在客户端及服务端的信息并不被人发觉),HTTPS加密应运而生。 什么是对称加密?简单的说,就是用一个密钥,可以对一段信息进行加密,也可以使用其本身对这段信息进行解密,这就叫做对称加密。 所以对称加密能防止中间人攻击吗?很难。 首先,如果能做到客户端和服务端都拥有这个密钥并且没有第三者知道,那理论上对称加密是可以的,但是如何做到不可能让别人知道呢? 无论这个密钥是客户端生成发送给服务端,还是服务端生成发送给客户端,此时如果有中间人窃取了该密钥的信息,那往后传输的所谓“加密”数据,中间人也都可以将其解密并加密继续传输下去而不被人发现。 显然,本来我们就想要防范中间人攻击,而对称加密想实施的前提就是保证没有中间人窃取密钥才可以。这是不是有点像“问:我们如何将房价降下来呢?答:把房子的价格降下来,房价自然降下来” 非对称加密简单说就是有两把密钥,一把叫做公钥、一把叫私钥,用公钥加密的内容必须用私钥才能解开,同样,私钥加密的内容只有公钥能解开。 所以非对称加密可以防范中间人攻击吗?鉴于非对称加密的机制,我们可能会有这种思路:服务器先把公钥以明文方式传输给浏览器,之后浏览器向服务器传数据前都先用这个公钥加密好再传,这条数据的安全似乎可以保障了!因为只有服务器有相应的私钥能解开公钥加密的数据。 然而反过来由服务器到浏览器的这条路怎么保障安全?如果服务器用它的私钥加密数据传给浏览器,那么浏览器用公钥可以解密它,而这个公钥是一开始通过明文传输给浏览器的,若这个公钥被中间人劫持到了,那他也能用该公钥解密服务器传来的信息了。所以目前似乎只能保证由浏览器向服务器传输数据的安全性 所以我们证明了一组公钥私钥,至少可以确保单向的数据安全,那么我可不可以合理推断如果我有两组公钥私钥,那我就可以保证双向数据传输的安全了呢?
bingo!好像成功了!但是这个方法并没有被大范围推广,并且也不可能被大范围推广。很重要的原因是非对称加密算法非常耗时,而对称加密快很多。 好家伙,说来说去又回到对称加密了,合着你就非得用对称加密是吗? 对!就是要找一个方法,让客户端和服务端都知道那个公共密钥并且确保第三方不会获取,那我就是可以放心的使用对称加密传输数据了 对称加密和非对称加密的综合版本
成功!HTTPS基本就是采用了这种方案。 但是这并不是完美的,这仍然有漏洞喔! 对称加密和非对称加密的综合版本的漏洞如果在数据传输过程中,中间人劫持到了数据,此时他的确无法得到浏览器生成的密钥X,这个密钥本身被公钥A加密了,只有服务器才有私钥A’解开它,然而中间人却完全不需要拿到私钥A’就能干坏事了。请看:
这样在双方都不会发现异常的情况下,中间人通过一套“狸猫换太子”的操作,掉包了服务器传来的公钥,进而得到了密钥X。根本原因是浏览器无法确认收到的公钥是不是网站自己的,因为公钥本身是明文传输的。 所以!我们只剩下最后一个问题,那就是怎么确保浏览器收到的公钥是网站的,而不是中间人的! 数字证书网站在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书持有者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明“该公钥对应该网站”。而这里又有一个显而易见的问题,“证书本身的传输过程中,如何防止被篡改”?即如何证明证书本身的真实性?身份证运用了一些防伪技术,而数字证书怎么防伪呢?解决这个问题我们就真的接近胜利了! 如何防止数字证书被篡改?数字签名
简单理解就是用签名者的私钥加密一串信息,将这串信息以及这串信息的加密版以及公钥都传给客户端,客户端收到信息后用公钥解密,如果解密的结果和明文传过来的数据相符合,那自然可以证明该公钥是真的。 故事到此为止就讲完了。但是好像遗留了一点性能问题 每次发送HTTPS请求都需要在TLS/SSL层进行握手传输密钥吗?如果是的话,那也太浪费资源和时间了吧。 服务器会为每个浏览器(或客户端软件)维护一个session ID,在TLS握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了!
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 20:28:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |