为什么要使用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的更多相关文章

  1. 彻底弄懂 JavaScript 执行机制

    本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定 ...

  2. Golang, 以 9 个简短代码片段,弄懂 defer 的使用特点

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  3. 一文看懂https如何保证数据传输的安全性的【转载、收藏】

    一文看懂https如何保证数据传输的安全性的   一文看懂https如何保证数据传输的安全性的 大家都知道,在客户端与服务器数据传输的过程中,http协议的传输是不安全的,也就是一般情况下http是明 ...

  4. 【TensorFlow】一文弄懂CNN中的padding参数

    在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和 ...

  5. 一文弄懂神经网络中的反向传播法——BackPropagation【转】

    本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法——BackPropagation   最近在看深度学习 ...

  6. [转]js模块化编程之彻底弄懂CommonJS和AMD/CMD!

    原文: https://www.cnblogs.com/chenguangliang/p/5856701.html ------------------------------------------ ...

  7. 【转】彻底弄懂Java中的equals()方法以及与"=="的区别

    彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...

  8. 这一次,彻底弄懂 JavaScript 执行机制

    本文转自https://juejin.im/post/59e85eebf265da430d571f89#heading-4 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还 ...

  9. [转帖]彻底弄懂UTF-8、Unicode、宽字符、locale

    彻底弄懂UTF-8.Unicode.宽字符.locale linux后端开发   已关注   彻底弄懂UTF-.Unicode.宽字符.locale unicode 是字符集 utf-8是编码格式.. ...

随机推荐

  1. 设计模式《JAVA与模式》之访问者模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述访问者(Visitor)模式的: 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要 ...

  2. Servlet 分页保存查询条件

    第一种情况:一个页面走一个JSP页面和Servlet 解决办法: /** 把用户这一次选择的所有条件保存Map集合中,再把 map存到Session会话中,点击分页时进入将Servlet中再将Sess ...

  3. 【JAVA】异常笔记

    自定义异常需要注意: 所有异常都必须是 Throwable 的子类. 如果希望写一个检查性异常类,则需要继承 Exception 类. 如果你想写一个运行时异常类,那么需要继承 RuntimeExce ...

  4. react项目中使用antd

    1.antd官网: https://ant.design/docs/react/introduce-cn 2.React中使用Antd 1.安装antd npm install antd --save ...

  5. TensorFlow的梯度裁剪

    在较深的网络,如多层CNN或者非常长的RNN,由于求导的链式法则,有可能会出现梯度消失(Gradient Vanishing)或梯度爆炸(Gradient Exploding )的问题. 原理 问题: ...

  6. 面试:用快排实现数组中的第K大的数

    #include <iostream> #include <cassert> using namespace std; int selectKth(int a[],int st ...

  7. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  8. Charles在Mac中抓包使用说明

    在工作期间,经过同事介绍,发现一款很强大的抓包工具Charles,现在记录下来分享给大家.常用的有以下几款功能: 1.支持配置抓取定向地址的网络请求 打开charles,打开Proxy->Rec ...

  9. laravel 区块继承

    看到我的文章感觉有用的话,在评论区下面扣1,能够让我感受到你们的存在,也给我动力继续写的更好,谢谢 定义: 在layouts\admin.blade.php @yield('要定义的区块名') @yi ...

  10. MySql错误处理-错误处理的例子

    有几种错误处理的声明形式: § 如果任何错误(不是 NOT FOUND ) , 设置 l_error 为 1 后继续执行: DECLARE CONTINUE HANDLER FOR SQLEXCEPT ...