一分钟理解 HTTPS 到底解决了什么问题
本文原作者“虞大胆的叽叽喳喳”,原文链接:jianshu.com/p/8861da5734ba,感谢原作者。
1、引言
很多人一提到 HTTPS,第一反应就是安全,对于普通用户来说这就足够了;
但对于程序员,很有必要了解下 HTTP 到底有什么问题?以及HTTPS 是如何解决这些问题的?其背后的解决思路和方法是什么?
本文只做简单的描述,力求简单明了的阐明主要内容,因为HTTPS 体系非常复杂,这么短的文字是无法做到很详细和精准的分析。想要详细了解HTTPS的方方面面,可以阅读此前即时通讯网整理的《即时通讯安全篇(七):如果这样来理解HTTPS,一篇就够了》一文。

(本文同步发布于:http://www.52im.net/thread-2027-1-1.html)
2、HTTPS相关文章
《即时通讯安全篇(七):如果这样来理解HTTPS,一篇就够了》
《一文读懂Https的安全性原理、数字证书、单项认证、双项认证等》
《苹果即将强制实施 ATS,你的APP准备好切换到HTTPS了吗?》
3、对HTTPS性能的理解
HTTP 有典型的几个问题,第一就是性能,HTTP 是基于 TCP 的,所以网络层就不说了(快慢不是 HTTP 的问题)。
比较严重的问题在于 HTTP 头是不能压缩的,每次要传递很大的数据包。另外 HTTP 的请求模型是每个连接只能支持一个请求,所以会显得很慢。
那么 HTTPS 是解决这些问题的吗?
不是,实际上 HTTPS 是在 HTTP 协议上又加了一层,会更慢,相信未来会逐步解决的。同时 HTTPS 用到了很多加密算法,这些算法的执行也是会影响速度的。
为什么说 HTTPS 提升了性能呢?因为只有支持了 HTTPS,才能部署 HTTP/2,而 HTTP/2 协议会提升速度,能够有效减轻客户端和服务器端的压力,让响应更快速。有关HTTP/2详细文章可以看看《从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路》、《脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)》,这里只要知道一点:HTTP/2 能够加快速度的主要原因在于多路复用,同一个连接能够并行发送和接收多个请求。

4、传统HTTP的安全性问题
当用户在浏览器输入一个网址的时候,在地址栏上看到小锁图标,就会安心,潜意识的认为自己的上网行为是安全的,当然对于小白用户来说可能还不明白,但是未来会慢慢改善的(万事开头难嘛)。
那么 HTTP 到底有什么安全问题呢,看几个例子:
1)由于互联网传输是能够被拦截的,所以假如你的上网方式被别人控制了(没有绝对的安全),那么你的任何行为和信息攻击者都会知道,比如我们连上一个匿名的 WIFI,当你上网的时候,输入的网站密码可能就已经泄漏了;
2)当我们在上一个网站的时候,莫名其妙跳出一个广告(这个广告并不是这个网站的),那是因为访问的页面可能被运营商强制修改了(加入了他自己的内容,比如广告)。
HTTP 最大的问题就在于数据没有加密,以及通信双方没有办法进行身份验证( confidentiality and authentication),由于数据没有加密,那么只要数据包被攻击者劫持,信息就泄漏了。
身份验证的意思就是服务器并不知道连接它的客户端到底是谁,而客户端也不确定他连接的服务器就是他想连接的服务器,双方之间没有办法进行身份确认。

有关HTTP比较好的文章,可以看看:
5、HTTPS 背后的密码学
为了解决 HTTP 的两个核心问题,HTTPS 出现了,HTTPS 包含了核心的几个部分:TLS 协议、OpenSSL,证书。
什么是 OpenSSL 呢,它实现了世界上非常重要和多的密码算法,而密码学是解决问题最重要的一个环节。
TLS 最重要的是握手的处理方式。证书的体系也很大,但是他们背后都是基于同样的密码学。
1)既然 HTTP 没有数据加密,那么我们就加密下,对称加密算法上场了,这种算法加密和解密要使用同一个密钥,通信双方需要知道这个密钥(或者每次协商一个),实际上这种方法不太可能,这涉及到密钥保密和配送的问题,一旦被攻击者知道了密钥,那么传输的数据等同没有加密。

2)这个时候非对称加密算法上场了,公钥和私钥是分开的,客户端保存公钥,服务器保存私钥(不会公开),这时候好像能够完美解决问题了。
但实际上会存在两个问题,第一就是非对称加密算法运算很慢,第二就是会遇到中间人攻击问题。
先说说中间人攻击的问题,假如使用非对称加密算法,对于客户端来说它拿到的公钥可能并不是真正服务器的公钥,因为客户端上网的时候可能不会仔细分辨某个公钥是和某个公司绑定的,假如错误的拿到攻击者的公钥,那么他发送出去的数据包被劫持后,攻击者用自己的私钥就能反解了。
3)接下来如何解决公钥认证的问题呢?证书出现了,证书是由 CA 机构认证的,客户端都充分信任它,它能够证明你拿到的公钥是特定机构的,然后就能使用非对称加密算法加密了。
证书是怎么加密的呢?实际上也是通过非对称加密算法,但是区别在于证书是用私钥加密,公钥解密。
CA 机构会用自己的私钥加密服务器用户的公钥,而客户端则用 CA 机构的公钥解出服务器的公钥。听上去有点晕,仔细体会下。这方面的知识,可以详细阅读:《即时通讯安全篇(七):如果这样来理解HTTPS,一篇就够了》。
4)上面说了非对称加密算法加密解密非常耗时,对于 HTTP 这样的大数据包,速度就更慢了,这时候可以使用对称加密算法,这个密钥是由客户端和服务器端协商出来,并由服务器的公钥进行加密传递,所以不存在安全问题。
5)另外客户端拿到证书后会验证证书是否正确,它验证的手段就是通过 Hash 摘要算法,CA 机构会将证书信息通过 Hash 算法运算后再用私钥加密,客户端用 CA 的公钥解出后,再计算证书的 Hash 摘要值,两者一致就说明验证身份通过。
6)HTTPS 解决的第三个问题是完整性问题,就是信息有没有被篡改(信息能够被反解),用的是 HMAC 算法,这个算法和 Hash 方法差不多,但是需要传递一个密钥,这个密钥就是客户端和服务器端上面协商出来的。
附录:更多安全方面的文章
《即时通讯安全篇(一):正确地理解和使用Android端加密算法》
《即时通讯安全篇(四):实例分析Android中密钥硬编码的风险》
《即时通讯安全篇(五):对称加密技术在Android平台上的应用实践》
《传输层安全协议SSL/TLS的Java平台实现简介和Demo演示》
《理论联系实际:一套典型的IM通信协议设计详解(含安全层设计)》
《微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解》
《来自阿里OpenIM:打造安全可靠即时通讯服务的技术实践分享》
《Web端即时通讯安全:跨站点WebSocket劫持漏洞详解(含示例代码)》
《IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token》
《即时通讯安全篇(七):如果这样来理解HTTPS原理,一篇就够了》
>> 更多同类文章 ……
(本文同步发布于:http://www.52im.net/thread-2027-1-1.html)
一分钟理解 HTTPS 到底解决了什么问题的更多相关文章
- 15分钟理解HTTPS——通俗篇
| 导语 它很深奥吗?你肯定常常见过它,使用它,甚至离不开它... 它很浅显吗?你可能觉得看透它,理解它,甚至懂它... 让我们用15分钟,不那么学术地将它的深挖到底~ 什么?如何证明我是我?本文要上 ...
- 接口测试之深入理解HTTPS
前言 随着网络安全问题越来越被重视,HTTPS协议的使用已经逐渐主流化.目前的主流站点均已使用了HTTPS协议:比如:百度.淘宝.京东等一二线主站都已经迁移到HTTPS服务之上.而作为测试人员来讲,也 ...
- 如果这样来理解HTTPS,一篇就够了!
1.前言 可能有初学者会问,即时通讯应用的通信安全,不就是对Socket长连接进行SSL/TLS加密这些知识吗,干吗要理解HTTPS协议呢. 这其实是个误解:当今主流的移动端IM数据通信,总结下来无外 ...
- 分分钟让你理解HTTPS
一.HTTP存在的问题 1.1 可能被窃听 HTTP 本身不具备加密的功能,HTTP 报文使用明文方式发送 由于互联网是由联通世界各个地方的网络设施组成,所有发送和接收经过某些设备的数据都可能被截获或 ...
- 前端读者 | 分分钟让你理解HTTPS
本文来自@Keely袁庆玲:来源:https://juejin.im/post/5ad6ad575188255c272273c4 目前来看大多数网站都从HTTP转向HTTPS,不在支持HTTP,所以了 ...
- 轻松理解https,So easy!
Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:翟志军 https://showme.codes/2017-02-20/understand-https/ 本文尝试一 ...
- 十分钟了解HTTPS
一.为什么要用HTTPS——HTTP协议的缺陷 通信使用明文(不加密),内容可能会被窃听 不能验证通信方的身份,所以请求和响应都有可能是攻击者发送的 数据包在由A到B的过程中,可能经历很多次路由转发, ...
- 十分钟理解Java中的动态代理
十分钟理解 Java 中的动态代理 一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...
- 也许,这样理解HTTPS更容易_转载
转自:也许,这样理解HTTPS更容易 原文衔接:https://showme.codes/2017-02-20/understand-https/ 作者:翟志军 摘要 本文尝试一步步还原HTTPS的 ...
随机推荐
- Python-lambda表达式和推导式
lambda表达式和推导式,可实现使用一行语句完成功能开发的效果,减少代码量. 1.lambda表达式 匿名函数,即没有名字的函数 1.1基本语法: lambda argument_list: exp ...
- PHP整理--PHP语句流程
PHP跟JS一样是从上往下的执行语句:同样的PHP也有if语句.循环.数组和函数. 一.条件语句 if..else... swich (1)多条if语句 $name=30; if($nam ...
- 编辑gif
在撰写文档的过程中,为了清晰的表述我们的内容经常会加入一些图片.对于 `.jpg` 或 `.png` 的静态图我们可以直接 使用windows自带的照片编辑器编辑即可.对于如 licecap 录制出来 ...
- 201771010134杨其菊《面向对象程序设计java》第十周学习总结
第8章泛型程序设计学习总结 第一部分:理论知识 主要内容: 什么是泛型程序设计 泛型类的声明及实例化的方法 泛型方法的定义 ...
- 上传文件,经过Zuul,中文文件名乱码
问题描述: 在学习<SpingCloud与Docker微服务架构实战>8.7节 使用Zuul上传文件,测试通过Zuul上传中文文件时出现,文件名.目录名或卷标语法不正确异常:但是直接通过上 ...
- redis设计原则
基本原则 只应将热数据放到缓存中 所有缓存信息都应设置过期时间 缓存过期时间应当分散以避免集中过期 缓存key应具备可读性 应避免不同业务出现同名缓存key --->解决方法: 保证键名不冲突 ...
- 项目管理-工作量评估 Manday
People's suggestion, 逻辑有待验证 1. Project sponsor - a new request 2. Study the related issue, to define ...
- js中的原型对象链
由于原型对象也是一个对象,它也有自己的原型对象并继承对象中的属性,这就是原型对象链:对象继承其原型对象,而原型对象继承它的原型对象,以此类推. 我们创建的每一个函数都有一个prototype(原型)属 ...
- node 项目中 koa2 环境搭建 以及项目发布
环境搭建: 1.Koa 必须使用 7.6 以上的版本.如果你的版本低于这个要求,就要先升级 Node. 查看node版本方法:node -v 2.使用koa-generator生成器生成项目 安装ko ...
- P3398 仓鼠找sugar (一道LCA的裸题)
https://www.luogu.org/problemnew/show/P3398 题意简单概括一下就是求树上两条路径是否相交; 有这样一个性质: if相交,则必有lca(a,b) 在路径c &l ...