揭开HTTPS的神秘面纱

在说HTTP前,一定要先介绍一下HTTP,这家伙应该不用过多说明了,大家每天都在用,每一次HTTP请求,都是一次TCP连接。遗憾的是,请求的内容在TCP报文中是明文传输的,任何人截取到请求都可以读取其中的内容,很尴尬。

数据加密

为了防止请求内容被人窃取,在网络传输的路上我们做不了手脚,那就只能对传输的数据报文上做手脚了。对报文内容进行加密就是其中的一种方法。

有一种加密算法叫做对称加密算法,即加密和解密使用同一个秘钥,使用这种算法对请求数据进行加密,中间人因为没有秘钥,无法读取其中的内容。但是,使用这种算法进行加密,肯定要同意秘钥,那秘钥在网络中传输同样存在被窃取的风险啊。

这时,出现了新的加密算法:非对称加密算法,它有两把钥匙,一把叫私钥,是只有自己知道的,另一个叫公钥,可以发到互联网山,随便谁都可以看到,也就是说,传输过程中即使被别人看到也无所谓。这时,A向B发消息时,可以先用B的公钥对数据进行加密,B收到消息后再使用自己的私钥进行解密,中间即使被窃取了,因为没有对应的秘钥,也无法对了数据进行解密。

但是,非对称加密算法要比对称加密算法慢上许多。一个折中的办法,先使用非对称加密算法来传输对称加密的秘钥,以确保秘钥安全送达,之后就可以使用对称加密算法来加密数据报文了。

中间人劫持

你以为现在可以高枕无忧了吗?你以为你可以放心安全的进行通信了吗?天真。

假设,你现在正在和A通信,来自灵魂的拷问:你怎么能确定和你通信的人是A呢?

我们假设,通信正常进行。在通信开始传输公钥的时候,请求被中间人C劫持了。C讲A的公钥换成自己的公钥发给了你,在你发送请求后,再讲你的信息解密,使用A的公钥进行加密,发送给A。这样,在你和A看来好像是在和彼此通信,其实所有的信息都经过了C,所有的信息都被C一览无余。

那么如何保证收到的公钥是A的呢?完犊子了,又回到开始的问题了,如何保证秘钥在网络中安全的传输。但这次,加密似乎救不了我们了,我们必须要确保收到的秘钥确实是A发来的,也就是说报文没有别中途篡改过。

数字证书

其实无法保证报文内容的关键,在于我们对于收到的公钥无法确定有没有被人修改过,那如果有一个我们信任的中间人S来传输这个公钥就可以了。问题来了,D的公钥传输中同样存在被修改的问题,拿到再找其他人来传输S的公钥么?这要下去简直没完没了,完全就是三次握手的翻版。

问题的根源是什么?我们没有一个可以信任的公钥,那么解决办法也很粗暴,我们在本地保存一个绝对信任的公钥,它不是通过互联网来获取的,而是预装在系统中的,也就是系统/浏览器预置的顶层CA证书。

这些预装信任的内容,就是CA证书。通过CA获取A的公钥时,获得的数字证书大概长这样:

当收到证书后,我们对信息通过童谣的hash算法计算出信息摘要,在用CA的公钥对数字签名进行解密,若解密后的信息摘要与我们计算的摘要相同,则可以认为信息没有被人修改过。验证流程如下:

难道这样就不拍别人篡改了么?不怕。因为我们已经拿到CA的公钥了,这是没有问题的。中间人因为没有CA的私钥,及时截取到信息,也无法对修改后的内容进行加密并生成对应的数字签名。

这样一来,信息的传输问题算是暂时告一段落了。(不知道什么时候就冒出了新的安全问题,毕竟道高一尺魔高一丈)

HTTPS

到这里,HTTPS介绍完毕,以上大概就是HTTPS的全部内容了。HTTPS的一次请求,大概流程如下:

  1. 浏览器发出HTTPS请求

  2. 服务器讲自己的数字证书返回

  3. 浏览器用预置的CA来验证证书,若没有问题,顺利拿到公钥

  4. 浏览器生成对称加密算法的秘钥,通过服务器的公钥进行加密,将报文发送给服务器

  5. 服务器用自己的私钥进行解密,得到对称加密的秘钥

  6. 可以开始用获得的对称加密秘钥进行通信了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

递归函数两种方式的区别

概述 递归函数都不陌生&#xff0c;比如计算n的阶乘&#xff1a; function f($n){if($n < 1) return 1;return $n * f($n-1); } 当然&#xff0c;有人可能会这么写&#xff1a; function f($n, $result){if($n < 1) return $result;return f($n-1, $n*$result); } 上…

Trie树

概述 在Google中随意搜索&#xff0c;如下所示&#xff1a; 他会自动显示相关的搜索&#xff0c;不知道有没有想过这个功能是如何实现的呢&#xff1f;面对海量的数据&#xff0c;它怎么能在我输入的同时&#xff0c;如此快速的检索到相关内容呢&#xff1f;当我查找资料后&am…

Python元组是什么

引出 在使用Python过程中&#xff0c;列表、集合和字典是比较常用的数据结构。 列表简单说就是数组&#xff0c;不对&#xff0c;它就是数组 集合就是去重的元素结构&#xff0c;和JAVA中的set一样 字典就是一个key-value的键值对&#xff0c;和JAVA中的HashTable一样 但是…

B+树

引言 时隔一年&#xff0c;我又想起当初看数据库时&#xff0c;看到的B树&#xff0c;就是数据库的索引使用的数据结构。再整理一下&#xff0c;看看自己没有忘记很多吧。 概述 B树之前&#xff0c;先来看一下二叉查找树&#xff08;1,2,3,4,5,6,7&#xff09; 恩&#xff0…

关于相对性的思考

换位思考是一直都在倡导的做法。也就是说&#xff0c;在考虑问题时&#xff0c;不光要站在自己的角度来思考&#xff0c;还要站在他人的角度来思考。不光要站在一个角度思考&#xff0c;要尝试多个角度来思考问题。 下面一则小故事&#xff1a; 熊大&#xff1a;熊二&#xff…

Python导入运行的当前模块报错

引言 今天遇到了一个奇怪的现象&#xff0c;简单举个栗子&#xff1a; 文件结构如下&#xff1a; 其中tt.py文件中定义了一个方法&#xff1a; def tt():print(tt) 我现在要在test.py中使用tt(), 代码如下&#xff1a; from test.tt import tt ​ if __name__ __main__:t…

Python中的+=

引出 今天在运行之前写的一个Python脚本时&#xff0c;发生了一个奇怪的现象&#xff08;我怎么老遇到奇怪的现象&#xff5e;&#xff5e;&#xff09;。当时的代码大概长这样&#xff1a; a [1, 2, 3] b [4, 5, 6] # ...一大段逻辑 c a c b # ...一大段逻辑 # 在这里&a…

网络带宽是什么

引出 最近有盆友在购买云服务器&#xff0c;问我带宽选多大的比较合适&#xff1f;当时我说&#xff0c;就你这小网站&#xff0c;整个1M妥妥的。 也罢&#xff0c;就简单介绍一下带宽吧。 概述 其实简单的说&#xff0c;可以比作网速&#xff08;当然还是有区别的&#xf…

js new Date 创建时间默认是8点

起因 最近在写一个页面&#xff0c;需要用到时间控制。然后我通过new Date()传入日期字符串创建了一个对象&#xff0c;并与当前时间做时间戳比较&#xff0c;结果12点刚过&#xff0c;就出问题了。举个栗子&#xff1a; // 假设当前时间是2019年12月22日0点20分 new Date(20…

js解决客户端与服务器时间不一致的问题

引出 最近在写一个项目时&#xff0c;要根据时间进行不同的展示&#xff0c;直接用new Date().getTime()获取当前时间&#xff0c;结果就出问题了。有些用户擅自修改自己的本地时间&#xff0c;导致获取到的时间并不是当前时间&#xff0c;尴尬。 思路 既然如此&#xff0c;…

Python实现cmd命令连续执行

之前是想写一个微信控制程序&#xff0c;通过登录网页微信&#xff0c;可以直接执行命令行代码。也不用ssh登录了&#xff0c;想法很方便。 但是现实很残酷&#xff0c;微信登录这块基本没有问题&#xff0c;已经有大佬写好了&#xff0c;但是命令行执行遇到问题了。 运行cmd…

Python可以减少代码量?我不信

突然看到好几篇文章&#xff0c;内容基本上是什么用Java需要100行&#xff0c;用PHP只需要30行&#xff0c;用Python只需要10行&#xff08;数字记不清了&#xff09;。简单说一下我的看法。 我不服&#xff0c;凭啥都是编程语言&#xff0c;你行我就不行&#xff1f; 我记不…

关于意志的思考

今天在看书后&#xff0c;突然有些感觉&#xff0c;恩&#xff1f;不对啊 先提出疑问&#xff0c;人类是否在做出选择、产生欲望时&#xff0c;是出于自己自由的选择&#xff1f; 如果是&#xff0c;那可以试着&#xff11;分钟让大脑什么都不去想&#xff0c;我试过了&#…

Ubuntu14升级MySQL

最近需要将测试环境的MySQL从5.6升级到5.7. 我就自己先虚拟机搭了一个Ubuntu14进行模拟升级, 不得了 开始了各种踩坑记录 方案一 此方案可以跳过, 全是坑. 搜索 Ubuntu14 MySQL升级5.7, 出现很多结果 查看后发现处理方法全都一样, 既然大家都是这么升级的, 肯定么得问题. …

微信朋友圈技术实现设想

前提 微信朋友圈是我们每天都在用的功能, 但是如果让你来实现一个微信朋友圈, 你会如何做呢? 我来简单设想一下. 实现功能 发朋友圈评论动态查看朋友圈(只能查看好友的)查看评论(只能查看共同好友的) 是不是看着很简单? 也没有几个功能嘛. so easy. 开始实现 数据库选用…

redis的多路复用是什么鬼

有没有人和我一样, 自打知道了redis, 就一直听说什么redis单线程, 使用了多路复用等等. 天真的我以为多路复用是redis实现的技术. 今天才发现, 我被自己骗了, 多路复用是系统来实现的. 对不起自己的专业了. 为了引出多路复用, 我来大胆设想一下技术的发展路程. 前提 一个应用…

WebSocket小叙

概述 刚看到WeSocket的时候&#xff0c;我以为是HTTP相关&#xff0c;但是在前两天搭了一个简单的Client之后, 我发现这不就是TCP长连接么? 建立连接->通信->断开连接. 直到今天, 我在调试的时候, 发现发出了HTTP请求, 我想, 事情可能不是我想的那样. 先来简单描述一下…

基于redis的分布式锁

概述 在之前, 我也使用redis做过分布式锁, 当时的做法是这样的: setnx: 向 redis中创建一个过期时间为1s的key, 若创建失败, 则锁获取失败expire: 获取锁成功后, 给锁增加过期时间del: 处理后释放锁 当时觉得貌似没什么问题. 是我太天真了, 今天突然想到, 恩, 有问题. 问题…

PHP实现RPC(简版)

概述 RPC这个东西是什么? 第一次听说他, 还要在它的前边加个G, 当时我以为GRPC是一项技术, 后来才知道, 并不是这样. GRPC只是RPC的谷歌实现. 谷歌搜了一下, RPC就是一种: 远程函数调用, 看到这里, 我已经等不及了, 不往下看了, 先自己实现一个. 如果只给你这样一个概念, 如…

如何生成全局唯一标识

引出 大家都用过QQ或者微信吧, 当我们注册的时候, 会被自动分配一个QQ号, 这个号码是全局唯一且固定的, 那么, 如果是你来写的话, 如何为新注册的用户分配一个号码呢? 亦或是一个电商网站, 要为每个订单生成一个订单号? 再或是一个即时聊天, 要为每个消息生成一个消息ID??…