一步步弄懂HTTPS
为什么要使用HTTPS?
HTTP采用明文传输,存在被监听、内容被篡改、身份被冒充的可能。为了保证安全性,需要对数据进行加密,这便有了HTTPS。
一步步分析HTTPS
1. 采用哪种加密方式加密数据?
| 空 | 对称加密 | 非对称加密 |
|---|---|---|
| 特点 | 唯一的密钥 | 一对公钥和私钥 |
| 优点 | 加密速度快 | 公钥公开,私钥保密,只要私钥不泄露就很安全 |
| 缺点 | 所有人都拿着同一密钥,一旦泄露,所有相关数据全部都暴露 | 速度慢 |
从上表的对比看出,使用非对称密钥显然更安全,但是加密速度慢。当数据量小的时候还好,数据大时显然存在不足。可是对称加密又不安全,怎么办?最好的办法就是结合它们俩——对数据加密采用对称加密,对对称加密的密钥采用非对称加密。

2.如何传输对称密钥?
客户端和服务端分别要用对称密钥来加密和解密,那这个对称密钥如何安全的让双方都知道呢?继续用对称密钥显然不行,此时就结合上非对称密钥。

3.中间人攻击

从图中看出,即使有中间人替换了真正的公钥,双方也无法得知,也就是说,双方无法确认对方身份。那如果对此公钥也进行加密呢?那这样还是会存在中间人攻击,也就是无法加密多少层,只要最外层的公钥需要传输给对方知道,最外层就有可能发生中间人攻击。这时候我们需要一个可以不需要传输公钥且又很安全的加密方法,此时就需要引入数字证书了(当然,数字证书的作用不仅仅只是不需要传公钥)。
4.数字证书

这里说明下,权威机构CA的公钥不需要传输,因为权威机构CA会和主流的操作系统合作,将它们的公钥内置在系统中,这样客户端收到数字证书后,从证书中找到权威机构CA的信息,然后根据此信息从本地找到此权威机构CA的公钥进行解密即可。
为什么要用签名这种方式?可以防止以下3种情况:
- 如果中间人对服务器公钥进行篡改,则客户端在收到后利用CA的公钥进行解密得到摘要,这将服务器信息经过hash后的摘要不同,则可以认为此证书不可信;
- 如果中间人对公钥进行篡改后,想要制造出假的签名以绕开以上情况,此时中间人无法获得CA的私钥,也就无法对摘要进行加密得到签名;即使强行找一个错的私钥进行加密,客户端收到后无法用CA的公钥进行解密也没用;
- 如果中间人对整个数字证书进行掉包(将中间人的公钥和域名发给CA,拿到中间人的数字证书),客户端收到时仍然可以利用CA公钥进行解密得到摘要,且对服务器信息(公钥、域名)进行hash得到的摘要一样,但证书中的域名与客户端正在访问的域名不一样,因此仍然认为此证书不可信。
Charles代理HTTPS
其实,Charles代理HTTPS的原理就是以上的第二种情况,即中间人Charles对服务器公钥进行篡改,然后利用Charles签证中心的私钥对服务器信息进行加密,传给客户端。不同的是,此时客户端已经信任了Charles签证中心,所以可以通过Charles签证中心的公钥对签名进行解密。因此,Charles能代理HTTPS的主要原因就是:客户端安装证书信任了Charles签证中心。
参考文章:
https://github.com/youngwind/blog/issues/108
https://blog.csdn.net/winwill2012/article/details/71774469
一步步弄懂HTTPS的更多相关文章
- 彻底弄懂 JavaScript 执行机制
本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定 ...
- Golang, 以 9 个简短代码片段,弄懂 defer 的使用特点
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- 一文看懂https如何保证数据传输的安全性的【转载、收藏】
一文看懂https如何保证数据传输的安全性的 一文看懂https如何保证数据传输的安全性的 大家都知道,在客户端与服务器数据传输的过程中,http协议的传输是不安全的,也就是一般情况下http是明 ...
- 【TensorFlow】一文弄懂CNN中的padding参数
在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和 ...
- 一文弄懂神经网络中的反向传播法——BackPropagation【转】
本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法——BackPropagation 最近在看深度学习 ...
- [转]js模块化编程之彻底弄懂CommonJS和AMD/CMD!
原文: https://www.cnblogs.com/chenguangliang/p/5856701.html ------------------------------------------ ...
- 【转】彻底弄懂Java中的equals()方法以及与"=="的区别
彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
- 这一次,彻底弄懂 JavaScript 执行机制
本文转自https://juejin.im/post/59e85eebf265da430d571f89#heading-4 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还 ...
- [转帖]彻底弄懂UTF-8、Unicode、宽字符、locale
彻底弄懂UTF-8.Unicode.宽字符.locale linux后端开发 已关注 彻底弄懂UTF-.Unicode.宽字符.locale unicode 是字符集 utf-8是编码格式.. ...
随机推荐
- 机器学习基石笔记:15 Validation
一.模型选择问题 如何选择? 视觉上 NO 不是所有资料都能可视化;人脑模型复杂度也得算上. 通过Ein NO 容易过拟合;泛化能力差. 通过Etest NO 能保证好的泛化,不过往往没法提前获得测试 ...
- vue中封装公共方法,全局使用
1.以封装的合并单元格为例,首先建立一个util.js 2.在main.js中引用 3.直接在使用该方法的地方调用就可以了
- django基础之二
一.什么是架构? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的We ...
- java 简单认识移位运算符和位运算符
移位运算符和位运算符本质上都是操作二进制位,因为计算机存储的是二进制数据,运算效率相对较高. 移位运算符:把整数的二进制位进行左移或右移 .左移一位,相当于这个数乘以2, 右移一位,相当于这个数除以2 ...
- easyui datebox 只选择月份的方法
easyui datebox 只选择月份的方法 效果如下图: 代码如下: <html > <head> <meta charset="utf-8"&g ...
- oc中的枚举
如果一个变量只有几种可能的值,比如星期有几天,一年有几个季节等.这个时候可以用枚举变量. 先定义类型再定义变量,如:enum siji{chun,xia,qiu,dong} 也可以定义匿名:enum{ ...
- Android 安装时报错INSTALL_FAILED_NO_MATCHING_ABIS 的解决办法
$ adb push D:\AndroidstudioTestWorkSpace\app\build\outputs\apk\app-debug.apk /data/local/tmp/c ...
- php插入数据含有特殊符号的处理方法
我们在向mysql写入数据时,比如: mysql_query(”update table set `title`=’kuhanzhu’s blog’”); http://www.cnblogs.com ...
- Linux-(watch,at,crontab)
watch命令 1.命令格式: watch [参数] [命令] 2.命令功能: 可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令. watch可以帮你监测一个命令的运行结 ...
- windows10 设置软件开机启动
在 C:\Users\your_name\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 在这个目录下,新建你想开机启动的软 ...