很多人讲不明白HTTPS,但是我能
很多人讲不明白HTTPS,但是我能
今天我们用问答的形式,来彻底弄明白HTTPS的过程
下面的问题都是 小明
和小丽
两个人通信为例
可以把小明
想象成服务端
,小丽
想象成客户端
1. https是做什么用的?
答:数据安全传输用的。
2. 数据如何安全的传输?
答:把数据加密以后,再发送。
3. 用哪种加密方式?
答:使用对称加密
方式
因为:
- 单向加密:数据解密不了,不适合
- 非对称加密:加密解密效率低,不适合
- 对称加密:加密解密效率高,非常适合
加密方式分3种:如下
- 单向加密 :对数据加密后,解密不了,主要用来验证数据完整性
- 非对称加密:使用密钥对,即公钥和私钥,公钥加密,私钥可解密,私钥加密,公钥也可解密,加密解密效率很低(公钥 - publicKey, 私钥 - privateKey)
- 对称加密:双方使用同样的一个密钥S进行加密解密。加密解密效率高
4. 使用对称加密,会产生一个问题,密钥S容易被截取,那么密钥S又如何安全传输过去?
和第1个问题类似。现在的问题是:怎么把密钥S安全传输给对方
答:
- 小丽拿到小明的publicKey
- 小丽用publickey对密钥S进行加密,得到S1
- 小丽把S1发送给小明
- 小明用自己的privateKey对密钥S1进行解密,得到密钥S
- 此后小明和小花就用密钥S,对称加密算法进行通信了。
注:我们用 publicKey, privateKey 分别代表 公钥和私钥
为什么:因为小丽用小明的publicKey加密,只有用小明的私钥才能解密
所以这个过程是安全的。
就算中间S1被别人截取了,因为没有小明的私钥,也解不开。所以是安全的。
因为私钥只有小明有,公钥是可以公开的,其它人有可能也会有。
上面的过程看似安全的,虽然黑客截取了数据,但是没有小明的私钥,是解不开的。
但是,如果小丽拿到的公钥不是小明的而是黑客的,会怎么样呢?
这就是中间人攻击了。下面分为小步骤讲解中间人攻击的过程
5. 什么是中间人攻击
答:我们为了清晰描述这个过程,分几个步骤:
- 在小明和小丽中间,有个黑客。也就是 小明 -- 黑客 -- 小丽
- 小明把自己的publicKey传给小丽的时候,被掉包了(别管黑客怎么办到的)。怎么掉包的呢?继续往下看
- 小明把publicKey传给小丽,但是中间有个黑客
- 实际上黑客截取了小明的publicKey。
- 然后,黑把自己也有一套自己的公钥和私钥,假如叫做 publicKeyHK, privateKeyHk
- 黑客把自己的publicKeyHK发给了小丽
- 接下来开始通信了
- 小丽用publicKeyHK把
密钥S
进行加密,生成密钥S1
- 小丽把
密钥S1
发送小明,此时被黑客截取 - 黑客用自己的私钥privateKeyHK,对
密钥S1
进行解密,得到密钥S
- 此时黑客有了真正的
密钥S
了,并保存了一份副本 - 然后黑客用小明的publicKey,对
密钥S
进行加密 ,得到密钥S2
- 黑客把
密钥S2
发送给小明 - 小明收到
密钥S2
,就用自己的privateKey,对密钥S2
解密,得到密钥S
- 上面小明是可以用自己的私钥解开
密钥S2
的,因为密钥S2
是用的小明的公钥进行加密的。 - 小明拿到了
密钥S
后,接下来就用对称加密,用密钥S
对数据进行加密,发送给小丽 - 因为中间有黑客,所以黑客就截取到数据,然后用
密钥S
把数据解密,就可以看到内容了。 - 黑客看完内容后(此时数据泄露了),再用
密钥S
对数据进行加密后,发送给小丽 - 此时小丽收到的数据,其实已经被黑客看过了。
- 所以此时,小明和小丽之间的通信已经不安全了。
- 这就是中间人攻击的整个过程,黑客就是所谓的那个中间攻,当然也可以是其它任何人。
所以,现在又产生了新的问题了了。可以用一张图来表示
小明和小花,以及老王,也就是本文中的
小明和小丽,以及黑客。这个图是以前做的,也懒得改了。能看懂就行。
6. 如何安全的传输公钥?
就像升级打怪一样
第1怪:如何安全的传输数据?
答案:用加密第2怪:用哪种加密?
答案:对称加密第3怪:密钥S 如何安全传输给小丽?
答案:小丽用小明的公钥对密钥S加密,然后传给小明
经过第3怪后,又产生了新的问题:小明的公钥(publicKey
)如何安全的传输给小丽?
小明把公钥传输给小花的过程中,公钥被中间人掉包了,所以
如何把公钥安全的传输给小丽,又成了现在阶段让人头疼的问题。
那么小明如何安全的把自己的公钥,安全的传输给小丽呢?
答案:CA机构。现在我们知道了,小明直接把公钥传输给小丽,有被掉包的风险,进而造成中间人攻击
直接从小明那里获取已经不安全了,那么就去CA机构里面获取公钥
7. CA机构是干什么用的?
问题1:想象一下,生活中,我们有个矛盾,有个问题,我们最相信的是谁?
答案1:肯定是政府啊
所以,我们也搞一个机构,并起个名,叫CA,我们大家都相信这个机构,这是规定。
问题2:CA是干什么用的呢?
答案2:就是解决公钥传输的问题的
CA是如何解决公钥传输的呢?
问题3:CA是如何解决公钥传输的呢?
答案3:小明把公钥给CA,不但是小明,其它的小强,小华,小乐....,都会把自己的公钥放在CA那里。
反应到互联网上,就是网站把自己的公钥放到CA那里,比如www.helloworld.net
网站,就会把自己的公钥放在CA那里。其它人想用公钥进行通信的,就会去CA获取对方的公钥。
在这里就是小丽去CA那里获取小明的公钥
注:CA也是够倒霉的,把传输公钥这么容易出问题的事,交给我。
没办法,CA就得干这个活,没办法,谁让它是CA呢
8. CA是如何解决,公钥传输问题的呢?
答案:使用数字证书。
讨厌,又出来一个名词,数字证书。
大家千万不要晕哈。坚持看完。
9. 数字证书是什么?工作原理是什么?
CA机构用来解决公钥传输,具体就是用数字证书来传输公钥。
所以,先强调一下:数字证书就是解决公钥传输问题的
如何想了解数字证书,先解决下面几个问题。
10. 数据传输过程中,如何保证内容不被篡改,即信息的完整性?
答案:使用单向加密,比如md5算法。
具体过程如下
- 小明用md5对
数据
进行加密,得到一个字符串,我们把这个字符串起个名字叫:摘要
- 小明把
数据
,对应的摘要
,都传给小丽 - 小丽收到
数据
,摘要
后,用md5对数据
进行加密,得到摘要2
- 对比
摘要
和摘要2
,如果相等,说明数据
是完整的,没有被改过。
注:道高一尺,魔高一丈
在验证数据完整性的过程中,如果黑客又参与了呢?
- 小明把
数据
,摘要
发给小丽 - 黑客截取了
数据
和摘要
- 黑客修改
数据
为数据1
,然后用md5对数据1
加密,生成摘要1
- 黑客把
数据1
,摘要1
发送给小丽 - 小丽收到
数据1
,摘要1
后,用md5对数据1
进行加密,得到摘要2
- 对比
摘要1
和摘要2
,如果相等,说明数据1
是完整的,没有被改过。 - 结果是相等,小丽以为数据没有被改过,其实已经被黑客改过了的。
上面这个过程,也可以用一张图来表示
依然是我之前写的文章中的配图,只不过名字不太一样,可以看懂即可。
11. 如何解决上面的问题,真正保证数据完整性呢?
答案:签名。
1. 什么是签名?
我们把几个名词放在一起,解释一下,容易说明白。
摘要:md5(或者其它单向加密算法),对数据进行加密出来的字符串,就叫做摘要
签名:小明用私钥对摘要进行加密,加密出来的字符串,就叫做签名
验签:小丽用小明的公钥,对签名进行解密操作,解密出来的摘要和原来的对比,就叫做验签
2. 非对称加密,另外一个作用:身份认证。 如何身份认证?
- 小明用md5对数据进行加密,得到
摘要
- 小明用自己的私钥对摘要进行加密运算得到
签名
- 小明将 md5, 摘要, 签名一起发送给小丽
- 小丽用小明的公钥对签名进行解密,到得信件摘要,假如为 d1
- 小丽用md5对信件内容进行运算,得到信件摘要,假如为 d2
- 对比 d1 和 d2 是否相等,相等说明信件内容
没有被篡改过
- d1 和 d2 不相等,说明信件内容
被篡改过
此时,这个过程就是安全的了
3. 什么是安全的呢?
比如,黑客又截取到了数据,摘要和md5算法
如果黑客再次截取了信件,黑客可以修改信件内容,再次用md5算出一个新的摘要出来
但是签名,黑客是修改不了的。因为签名是用的小明的私钥加密的,就算黑客能解密出来
黑客是没有办法生成新的签名的,因为小明的私钥只有小明自己有。
而且小丽收到信后,是用小明的公钥进行对签名解密的,黑客假如用自己的私钥对摘要进行加密生成新的签名
小花用小明的公钥是解密不了的。
12. 数字证书是怎么由来的?
答案:数字证书是由CA机构颁发的,比如小明想要一个数字证书,就需要向CA机构申请
13. 数字证书里面包含什么?
- 小明的公钥
- 颁发者:CA(证书认证机构)
- 有效期:证书的使用期限
- 摘要算法:指定的摘要算法,用来计算证书的摘要
- 指纹:也就是证书的摘要,保证证书的完整性
- 签名算法:用于生成签名,确保证书是由CA签发
- 序列号:证书的唯一标识
14. 数字证书里面的内容,如何产生?
将小明的公钥,颁发者,有效期,摘要算法 ,哈希算法写入证书
CA 根据证书中的指定的哈希算法
对证书整个内容(包含公钥,颁发者,有效期等)用哈希算法计算出整个证书的摘要,即 digest
也可以叫证书的指纹
CA根据签名算法以及上一步计算出来的摘要
**CA用自己的私钥对摘要进行加密,生成CA的签名,即 signature ** (记住这句话,后面有用)
最后把摘要,签名以及证书的基本信息,一起发布,就得到了小明的证书
15. 数字证书如何工作?
从上面的描述我们知道,数据证书就是用来解决公钥传输问题的。
同时我也告诉你,证书其实就是一个文件 。
那么证书是如何解决传输问题的呢?
通过下面几个小问题,我们来一点点揭开证书的工作原理
1. 小丽如何拿到小明的证书?
答:多种方式,比如从网站上下载。
2. 小丽拿到证书后,第一件事要干什么?
答:要验证证书是不是CA发的
解释:因为我们只相信CA是权威的,其它人发的我们认为是不安全的。所以要验证证书是否是CA发的。
3. 小丽如何验证证书是不是CA发的?
答:验签
4. 什么是验签?
答:所谓 验签 : 就好比你对合同中的签名进行签证,到底是不是某个人的真实字迹
证书 - 签名,就类似 : 合同 - 签字
那么验签,就好验证一下,合同中的名字,是不是某个人的真实字迹,验证真的是这个人签的字。
在数字证书里面,验签:就是验证这个数字证书到底是不是CA颁发的。
5. 如何验签?
上面说过:CA用自己的私钥对摘要进行加密,生成CA的签名,即 signature
所以,验签就需要CA的公钥。
答:验签的步骤:
- 小丽用CA的公钥对signature进行密钥,生成摘要
d1
。 - 然后再用证书里面的哈希算法,对证书进行哈希运算,到得摘要
d2
。 - 如果 d1 == d2 , 验签通过,说明证书的确是CA颁发的。否则则不是,不安全。
6. 小丽从哪里获取到的CA的公钥?
答:操作系统自带的。
解释:
通过上面,我们知道,公钥在证书里面。
我们去哪里找CA的证书呢?
我们知道,需要证书,就去CA申请,CA会给我们颁发证书
那么CA机构也需要证书,从哪来呢?
其实也是CA颁发的,也就是CA自己给CA颁发证书。
当你安装操作系统的时候(不管是windows,linux,macos,android,ios等)
操作系统里面内置了大量的CA的证书。
所以我们无需关心CA的证书从哪里来。
7. 证书具体怎么工作?
答:步骤如下:
例如:小丽下载到了小明的证书。(相当于互联网里面,客户端从网站服务器那里下载了服务器的证书)
- 验签:验证证书是不是CA颁发的。
- 如果是CA颁发的。
- 看一下证书的所有的者不是小明的。
- 如果是,那么小丽就真的拿到了小明的证书
- 小明的证书里面, 有小明的公钥。
至此,我们完成了一件事:小丽安全的拿到了小明的公钥
我们先来看看,证书长什么样。在浏览器中打开 www.helloworld.net
我们看一下证书是什么样,如下图
在这里打一个小小的宣传一下我的副业,www.helloworld.net
是由码农兔哥在业余时间开发的一个技术社区
并获得了facebook公司的一个技术大牛的投资
希望大家多多喜欢支持。也可以加兔哥的微信,互相交流技术,吹牛,交朋友。vx: daitukeji
16. HTTPS工作的整个流程
通过上面的讲解,我们现在把整个流程串一遍
- 小丽下载了小明的证书
- 小丽对证书进行验签
- 验签通过,的确是CA颁发的
- 小丽从证书里面查看一下,证书所有者,的确是小明的。
- 小丽从证书里面拿到小明的公钥
- 小丽用小明的公钥,协商一个对称加密算法,并把对称算法的密钥S,进行加密得到S1
- 小丽把S1发到小明
- 小明收到S1,用自己的私钥解密,得到S
- 小明用对称加密算法,密钥S,对想到发送的数据进行加密,发给小丽
从此小明和小丽就可以安全的进行通信了。
17. 最后大总结
下面依然是以问答的方式,来总结所有的步骤。
如果你觉得本文对你有用,码字不容易,
请多支持一下,比如可以多转发,让更多的技术看到此文,多学点知识。
也可以访问一下
wwww.helloworld.net
, 注册个账号,如果你也喜欢写文章可以尝试在
www.helloworld.net
上面写一些文章或者加个微信交流一下技术也很欢迎,兔哥很谦虚,也很喜欢交朋友。
而且兔哥做过10多年研发,在实际工作中用过(不是写demo的那种)MFC,C/C++, Qt, bkwin, WTL,
duilib, ThinkPHP, vue2 , nuxt2 , ReactNative ,Android , Go 。 所以咱们能聊的应该很多。
vx: daitukeji
小丽和小明想安全的通信,怎么办?
对数据加密
用哪种加密方式
对称加密
密钥S如何安全的传输
小丽用小明的公钥对S进行加密,发给小明,小明用自己的私钥解密。
就这样,就传过来了。小明的公钥如何安全的传输给小丽?
用数字证书
数字证书干什么用的?
用来安全传输公钥用的
- 数字证书是谁颁发给小明的?
CA颁发的。具体就是小明向CA申请。
- 如何辨别证书是否是CA颁发的?
用CA的公钥,对证书进行验签,通过说明是CA发的。
- 小丽如何知道证书是小明的?
证书里面记录的有证书所有者
好了,码字真的好累,自己整理了一天
也是发现其它的文章HTTPS的原理讲的不是很明白。
自己下定决心也写一篇,其它在之前也写过一篇
但是那次写的,觉得还不通透,语言不够简练。
所以这篇文章希望能用更简练的语言,来把HTTPS的原理说明白。
如果你觉得文章对你有用,请点个赞或者转发一下吧,兔哥在此谢谢啦。
很多人讲不明白HTTPS,但是我能的更多相关文章
- 为什么很多人坚信“富贵险中求”?
之家哥 2017-11-15 09:12:31 微信QQ微博 下载APP 摘要 网贷之家小编根据舆情频道的相关数据,精心整理的关于<为什么很多人坚信"富贵险中求"?>的 ...
- 我曾经用“UC震惊部”震碎了很多人的三观
Hi,欢迎大家在有空的时候做客[江涛学编程],这里是2023年的第9篇原创文章,今天写的这篇是当事人对昨天上热搜的统一回复. 我没有曾经跨过山河大海,我也没有曾经穿越人山人海,但我曾经用"U ...
- 很多人都在埋怨没有遇到好的团队,但好的团队不可能凭空出现,一流的团队不能仅靠团队成员努力,作为Leader,要有可行的规划,并坚定地执行、时势地调整(转)
<西游记>中的唐僧团队历经千难万险,终于求得真经,目标明确.分工合理为这支队伍最终走向成功奠定了基础.唐僧从一开始,就为这个团队设定了西天取经的目标,虽然经历各种挫折与磨难,但目标从未动摇 ...
- 神贴真开眼界:为什么很多人倡导重视能力和素质,但同时对学历有严格要求?——代表了上一场比赛的输赢,招聘成本很重要。如果上一场游戏失败了,尽量让自己成为当前群体的尖子。学历只是其中的一个作品而已,但学历代表了学生时代为之做出的牺牲。人群自有偏向集中性 good
对于软件工程师职位,没学历没关系,如果真觉得自己才高八斗,请在简历里附上 github项目链接或者 appstore/google play上你的作品.如果学历比别人低,那么想必是把时间和精力用在了其 ...
- 很多人以为 connect 和 disconnect 应该像 new 和 delete 一样成对出现 这是错误的(只要 sender 或 receiver 其中之一不存在了,connect 会自动失效。QObject::connect 函数是线程安全的)
其实我写文章也是边查资料边编辑的 有时候是怕自己的阐述不严谨,有时候是怕自己重复造轮子 就像有些人不停的教大家QLabel QDialog QWidget 个人是不屑的 命令模式 用 Qt's Und ...
- 一道简单的 Java 笔试题,但值得很多人反思!
前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要 ...
- 近日让很多人议论纷纭的P++,PHP新分支?
最近大家可能有看到一个新的名词——P++. 很巧这个词来源于不久前从 Zend 公司离职的 Zeev Suraski 以 PHP 开发组成员的身份提议要创建 PHP 方言,暂命名为 P++. 老兄最近 ...
- 很多人都搞不清楚C语言和C++的关系!今天我们来一探究竟为大家解惑~
最近,身边有许多小伙伴已经开始学习编程了,但是呢,学习又会碰到许多的问题,其中作为新手小白提到最多的问题就是编程语言的选择. 每次遇到这种问题,看起来很简单,但是又有很多小伙伴搞不清编程语言之间的关系 ...
- 上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?
今天群里有人聊图片上传,简单说下自己的经验(大牛勿喷) 0.如果你的方法里面是有指定路径的,记得一定要过滤../,比如你把 aa文件夹设置了权限,一些类似于exe,asp,php之类的文件不能执行,那 ...
- 我来科普一下为毛很多人升级了20M的电信光纤宽带反而感觉速度更卡了
下载(在线看视频,看网页,下载游戏这类都是属于下载类应用) 为毛很多人升级20M光纤更慢了呢? 因为电信对你的上传速度做了手脚, 8M以及以上家用光纤宽带全部上传限速到100KB/s 也就是1M带宽 ...
随机推荐
- locust常用的配置参数【locust版本:V1.1.1】
locust 官网文档地址:https://docs.locust.io/en/stable/configuration.html Locust QQ 群: 执行命令如: master: locust ...
- Python阿里云消息推送调用API
很多公司测试APP推送时候,应该也是很头疼:推送环境:测试.正式,稍不注意就把测试的push到正式上,导致所有用户都收到 例子很多: 其实阿里.极光都有推送Api,直接调用API就ok,特别是有的公司 ...
- 剑指offer004(Java)-只出现一次的数字(中等)
题目: 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回那个只出现了一次的元素. 示例1: 输入:nums = [2,2,3,2] 输出:3 示例 ...
- 力扣238(java)-除自身以外数组的乘积(中等)
题目: 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 . 题目数据 保证 数组 nums之中任意元素的全 ...
- 力扣647(java)-回文子串(中等)
题目: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目. 回文字符串 是正着读和倒过来读一样的字符串. 子字符串 是字符串中的由连续字符组成的一个序列. 具有不同开始位置或结束位置 ...
- KubeVela v1.3 多集群初体验,轻松管理应用分发和差异化配置
简介:KubeVela v1.3 在之前的多集群功能上进行了迭代,本文将为你揭示,如何使用 KubeVela 进行多集群应用的部署与管理,实现以上的业务需求. 作者:段威(段少) 在当今的多集群业务 ...
- 【产品动态】一文详细解读智能数据构建产品Dataphin的“规划”功能
简介: 数据中台是传统的数据仓库的一种升级, 是数据采集.建设.管理与使用的一整套体系,Dataphin是一个构建数据中台的强大工具, 核心优势是在数据的建设与管理上引入了阿里巴巴多年来数据中台建设 ...
- MYSQL深潜 - 剖析Performance Schema内存管理
简介: 本文主要是通过对PFS引擎的内存管理的源码的阅读,解读PFS内存分配及释放原理,深入剖析其中存在的一些问题,以及一些改进思路.本文源代码分析基于Mysql-8.0.24版本. 作者 | ...
- [FE] iframe 相关选项 x-frame-options: 设置 meta 标签无效 & helmet
The X-Frame-Options HTTP 响应头是用来给浏览器 指示允许一个页面 可否在 <frame>, <iframe>, <embed> 或者 < ...
- [FE] G2Plot 更新图表的两种方式
第一种是使用 G2Plot 对象上的 changeData 方法,如果不涉及到全局 title 等这些的更改,可以采用这种方式. 也就是说,只有纯数据方面的变动,使用 changeData 更新图表数 ...