为什么要使用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. sudoer命令各参数含义及设置

    对于普通用户sudo加权的时限制可以执行的命令 https://segmentfault.com/a/1190000007394449 需要修改/etc/sudoers 1. 字段说明如下 授权用户/ ...

  2. 如何进行bug总结

    在项目过程中,测试同学会发现大量的bug,但同时也不可避免的会存在一些遗漏的bug.为了能够减少遗漏bug的现象,我们需要针对遗漏的问题进行总结,从教训中积累经验,总结方法,从而提高测试的覆盖度,提升 ...

  3. mvn cli 搭建项目架构

    创建如图所示目录结构 在system-parent创建如下目录 ├─system-dao ├─system-domain ├─system-service └─system-web 创建system- ...

  4. (转)通过 Javacore 诊断线程挂起等性能问题

    原文:https://www.ibm.com/developerworks/cn/websphere/library/techarticles/1406_tuzy_javacore/1406_tuzy ...

  5. 多线程之CountDownLatch和CyclicBarriar使用

    CountDownLatch和CyclicBarriar是java.util.concurrent包下面提供的多线程同步工具,两者有点相似,相当于计数器,但是用处还是有区别的. CountDownLa ...

  6. 【转】Intellij IDEA使用总结

    原文地址:http://totohust.iteye.com/blog/1035550 1. IDEA内存优化 先看看你机器本身的配置而配置. \IntelliJ IDEA 8\bin\idea.ex ...

  7. React技术栈梳理

    一.react是什么? react是一个js框架,可以用它来编写html页面,使用react后我们可以完全抛弃html(只需要一个主index文件),而用纯js来编写页面: 二.为什么要使用react ...

  8. Spring开发步骤

    1) 源码, jar文件:此处用的是spring-framework-3.2.5.RELEASE commons-logging-1.1.3.jar                日志 spring- ...

  9. Java队列——线程池创建的例子

    线程池为线程生命周期开销问题和资源不足问题提供了解决方案.通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上.其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟.这 ...

  10. spring scope 作用域

    转自:http://www.cnblogs.com/qq78292959/p/3716827.html 今天研究了一下scope的作用域.默认是单例模式,即scope="singleton& ...