一、背景

在使用抓包工具charles的时候,我们的项目大部分是基于https的,报文没办法直接看到需要进行相应的配置,配置的过程中发现自己对https的知识点有点遗忘了,知识点越混乱,自己越难受,于是抱着这个目的,自己又重新梳理了一遍https的知识点。

二、目标

万物负熵而生,我们要做的是"熵减" 而不是"熵增"。

我们另外一个目标就是打造一个老太太白话都能听到的https讲解。

三、前序

阅读本文的前提是基于你对http的知识点有一个清晰的了解,以及传输层协议tcp和网际层ip协议有一个大概的了解。如果不了解这方面的相关知识,建议学习后在来阅读本文。

四、起因

http天生明文的缺点,这让很多高安全性的场景无从谈起,例如网购、网银,证券、电子政务。例如:你高考考了300分,但是你在老师上报给教务系统的过程中,篡改了分数(改编英国某大学案例)。这个明显不符合我们现实生活的需要。

问:为什么http天生是明文?

答:它使用的是肉眼可读的ascii编码方式。

这种明文的通信方式,我们认为是不安全的,所以促使着我们需要安全的通信方式。

五、安全性

刚刚提到http是“不安全”的通信协议,如果将传输的报文变成密文,就可以是安全的通信协议嘛?

所以我们需要定义什么样的通信是安全的。通常认为,如果通信过程具备了四个特性,就可以认为是“安全”的,这四个特性是:机密性、完整性,身份认证和不可否认。

我们就来讲讲这四个特性:

机密性(Secrecy/Confidentiality)是指对数据的“保密”,只能由可信的人访问,对其他人是不可见的“秘密”。

完整性(Integrity,也叫一致性)是指数据在传输过程中没有被篡改,不多也不少,“完完整整”地保持着原状。

身份认证(Authentication)是指确认对方的真实身份,也就是“证明你真的是你”,保证消息只能发送给可信的人。

不可否认(Non-repudiation/Undeniable),也叫不可抵赖,意思是不能否认已经发生过的行为,不能“说话不算数”“耍赖皮”。

知道了这四点,也就明白了https要做的事情,也就是增强上面四点,下面就是围绕着https是怎么增强这四点展开的。

六、正篇

1、介绍

https的官方定义比较短,RFC 文档很小,只有短短的 7 页,里面规定了新的协议名“https”,默认端口号 443,它安全兼容http协议,没有增加新的语法和语义,在学习上没有新的成本。

https相对于http多了一个SSL/TLS层,我们放一张对比图:

2、SSL/TLS

刚从图中看到https多了一层SSL/TLS,那就了解这个是干什么用的。

SSL是网景公司于1994年提出的,有v2和v3两个版本。

SSL发展到v3,被证明是一个非常好的安全通信协议。于是互联网工程组IETF在1999年就把改名为TLS(传输层安全,Transport Layer Security)正式标准化,版本号从 1.0 重新算起,所以 TLS1.0 实际上就是 SSLv3.1。

到今天 TLS 已经发展出了三个版本,分别是 2006 年的 1.1、2008 年的 1.2 和去年(2018)的 1.3,每个新版本都紧跟密码学的发展和互联网的现状,持续强化安全和性能,已经成为了信息安全领域中的权威标准。

目前应用最广泛的还是1.2这个版本,之前的版本被认为不安全的,后续各大浏览器将逐步废除。

TLS由记录协议、握手协议、变更密码规范协议、扩展协议等几个子协议组成。

浏览器和服务器在使用 TLS 建立连接时需要选择一组恰当的加密算法来实现安全通信,这些算法的组合被称为“密码套件”(cipher suite,也叫加密套件)。

举个例子:“ECDHE-RSA-AES256-GCM-SHA384”。

看到这么长的字母是不是非常晕,其实TLS的密码套件格式命名非常规范:“秘钥交换算法+签名算法+对称加密算法+摘要算法”。

3、机密性

实现机密性最重要的手段就是加密,把肉眼可见的报文转化成看不懂的密文。

科普:战争年代诞生了很多加密方式,指挥部要把作战指令发送给前线,怕被敌人截获,就需要将报文转化成密文,发给前线,前线的接线员再拿着密码本将密文转成明文,从而执行作战指令。如果被截获了,且被破解了,对某一次战事的结果,都是至关重要的。山本十五六的死亡就是因为报文被美军破译了导致的。

在计算机,我们没有什么特定的密码本,我们通过“加密算法”去加密“明文”,变成一段乱码,也就是"密文",接收方需要拿着钥匙才能还原”明文“, 这个钥匙叫做”秘钥“。

在计算机里面,秘钥是一长串数字,长度是按照比特来衡量的,也就是128的长度,对应着16字节。

a、对称加密算法

白话讲,就是发送方和接送方,加密和解密的钥匙都是同一把秘钥。

大家可能会好奇,这有什么作用:

黑客如果在网际层截获了你的报文,他看到的也只是一串乱码,没有对应的钥匙,解不开这个密文,所以实现了安全性。

TLS里面定义了很多对称加密算法,废除了一些,废除的算法这里我就不枚举了,剩下常用的就是两个。AES和ChaCha20。

AES 的意思是“高级加密标准”(Advanced Encryption Standard),密钥长度可以是 128、192 或 256。安全强度很高,性能也很好,而且有的硬件还会做特殊优化,所以非常流行,是应用最广泛的对称加密算法。

ChaCha20 是 Google 设计的另一种加密算法,密钥长度固定为 256 位,纯软件运行性能要超过 AES,曾经在移动客户端上比较流行,但 ARMv8 之后也加入了 AES 硬件优化,所以现在不再具有明显的优势,但仍然算得上是一个不错的算法。

b、对称加密的分组模式

对称算法还有一个“分组模式”的概念,它可以让算法用固定长度的密钥加密任意长度的明文,把小秘密(即密钥)转化为大秘密(即密文),常用的是 GCM、CCM 和 Poly1305。

C、非对称加密

刚刚说到对称加密算法,看起来有点完美,但是有一个问题,加密和解密都需要同一把密钥,那么问题来了,通信双方怎么传输密钥。

对称加密算法,需要双方先传输密钥,如果黑客一开始就获取了这个密钥,即使后面的密文再怎么传输,也没有机密性可言。

这时候,我们的主角登场,非对称加密。

它有两个钥匙,一个公钥,一个私钥。两个钥匙是不同的,公钥加密的密文只能用对应的私钥解密,反过来,私钥加密的密文,只能有对应的公钥解密。

非对称加密算法可以解决”密钥交换“的问题,服务器自己保管私钥,公钥发放给浏览器。浏览器用公钥加密,发送给服务端,黑客就算截获,没有对应的私钥,仍然无法破解密文。

当然看到这,你们可能会有疑问了,先不要急,继续往下看。

非对称加密的算法因为设计比较难,比较少。老规矩,废弃的我们不说,我们只说常用的,常用的有RSA和ECC。

RSA 可能是其中最著名的一个,几乎可以说是非对称加密的代名词,它的安全性基于“整数分解”的数学难题,使用两个超大素数的乘积作为生成密钥的材料,想要从公钥推算出私钥是非常困难的。

它的长度通常有两种,1024和2048,不同长度运算量不同。

ECC(Elliptic Curve Cryptography)是非对称加密里的“后起之秀”,它基于“椭圆曲线离散对数”的数学难题,使用特定的曲线方程和基点生成公钥和私钥,子算法 ECDHE 用于密钥交换,ECDSA 用于数字签名。

目前比较常用的两个曲线是 P-256(secp256r1,在 OpenSSL 称为 prime256v1)和 x25519。P-256 是 NIST(美国国家标准技术研究所)和 NSA(美国国家安全局)推荐使用的曲线,而 x25519 被认为是最安全、最快速的曲线。

比起 RSA,ECC 在安全强度和性能上都有明显的优势。160 位的 ECC 相当于 1024 位的 RSA,而 224 位的 ECC 则相当于 2048 位的 RSA。因为密钥短,所以相应的计算量、消耗的内存和带宽也就少,加密解密的性能就上去了,对于现在的移动互联网非常有吸引力。

小tips:

ECC只是定义了公钥和私钥,但是没办法进行密钥交换和身份认证,需要搭配DH、DSA,形成专门的子算法,ECDHE、ECDAS。RSA比较特殊,本身就支持密钥交换和身份认证。

D、混合加密

TLS里面的混合加密,说白了也非常简单,没有什么特殊性可言。

我们先来理清楚因果关系:

对称加密算法:双方传输密钥的时候,怕被拦截,这时候就需要保证密钥是安全的,也就是在一次通话中,这个密钥,只能通信的双方知道。

非对称加密算法:通过公钥和私钥的不同,服务器私钥的私有,来保证对称加密私钥的传输。

看到这是不是有一点启发了,我们接着往下看,先不要急。

4、完整性

仅有机密性不够,黑客如果获取足够多的明文,尝试重组,新增或删除几个字符,然后发给服务器,去尝试,然后根据服务器的反应,进行下一步的动作,只要有足够的耐心,迟早也能破解出明文。

所以我们需要保证传输内容的完整性。

计算机里面保证完整性最主要的方式就是使用摘要算法,实际上就是散列函数,哈希函数。

摘要算法,就是将任意长度的数据转换成固定长度的字符串。

这里面最重要的就是单向性和”雪崩效应“。

单向性:

只能通过算法,将数据转换成治摘要,而没办法将摘要还原。

它必须是这样的,不然就没有机密性可言,黑客拿到摘要,能反推出原文,这是非常可怕的。

雪崩效应:

熟悉算法的朋友应该非常了解,任何源数据hash成一个key的时候,如果源数据一个细小的变化,可能增加一个字符串,一个空行等等,都会导致两份摘要截然不同。

正因为如此,黑客没办法通过重组报文,去尝试。

摘要算法有很多,老规矩废弃的我们不讲,目前常用的算法就一种,SHA-2,它是SHA-1的继任者,子类型有SHA-224, SHA-256, SHA-384。

对应是的生成是28字节,32字节,48字节长度的摘要。

那么有了摘要算法,就可以保证消息的完整性了。

例如:

你向服务端发送了一句话,"我叫泫雅,我要存1000元"。将这个原文通过摘要算法计算出摘要,然后附加在原文后面,一起发给服务端。服务端收到报文之后,也将原文计算一遍,再和取出来的摘要比较。一致的话,说明这个原文是没有被修改过的,就值得信任。

当然在混合加密系统里面,原文+摘要组成新的报文,会将这个新的报文加密发给服务端。

5、身份认证

讲到这里的话,大家是不是觉得在整个通信过程中已经是足够安全的了,但是我们还忽略了一个至关重要的点,那就是通信双方的两个端点。

倘若现在黑客不再想着去截获报文,破解报文。黑客变聪明了,假如你在淘宝服务,黑客把自己伪装成淘宝服务器,这时候你不知道你是和假的人通信,然后把银行卡,密码都说出去了,这样子仍无安全性可言。

这种案例从古至今,比比皆是。

例如:古代某位忠臣上书参奏某个奸相,这个奸相串通皇帝身边的宦官,忠臣的上书没有直接到皇帝面前,而是被宦官拦截了,同时伪造了一份圣旨,要将这个忠臣满门抄斩。忠臣以为这是皇帝的意思,自始至终认为自己都是跟皇帝通信,然后含泪而死。

上面这个案例给了几个启示:

1、通信的报文怎么走,这个是对发送方不可知的。

2、你知道能确认对方的身份,而不是一个假的人伪造了报文给你。

古代和现代的做法,思路都是一致的,使用一个大家都无法伪造的东西。

先来说说古代是怎么做的:

1、圣旨用的是独一无二的宣纸,这种宣纸不是谁都可以拿得到。

2、盖上自己权威的标识,也就是皇帝的玉玺盖章。

这样子所有的大臣,看到带有玉玺,使用宣纸的圣旨,就说明这个一定皇帝颁发的旨意。

那么计算器的世界里面是怎么做这个事情的呢?

答案是数字签名。

刚刚我们讲到了一个东西,非对称加密的私钥和公钥,私钥是服务端独有,公钥是分发出去的,任何人都可以拥有。正因为私钥的私有性,它是属于服务端独一无二的东西,所以用它可以实现数字签名。

原理很简单:

服务端利用私钥,再加上摘要算法,就可以同时实现身份认证和不可否认。

很多人看了很多博客,仍然不懂数字签名的意思,只记得一个官方的概念。这里我举个例子,来说明一下。

这里举,我跟小红书的例子。

由于非对称加密的运算量很大,一般数字签名只加密原文的摘要,发送给我。

这里我收到了之后,再拿小红书给我的公钥,我能解开,就说明这封报文是小红书发出来的,不是造假的报文。

剩下来的关键就来了:

你得到小红书给你发送的公钥,你怎么知道这个人就是小红书呢?

现实生活中,我们怎么知道一个人的身份,而不是伪造的,靠的是身份证。身份证是由权威机构,像公安局颁发给你的,通过这个证件,你就能证明你是谁。

那么网络世界里,有没有这个东西,答案是有的。

这个机构就叫做CA(Certificate Authority,证书认证机构)白话里讲,它就是网络世界里的公安局,它给各个公钥签名,然后颁发给你。

通常CA的签名是有格式的,通常有有效期,序列号,用途,颁发者,公钥等等,最终会生成一个数字证书,有了这个证书,你就可以准确无误的知道对方的身份。

在网络世界里,全世界的CA也就那么几家,按照可信度区分的话,有DV、OV、EV,其中DV是最低的,只有域名级别的可信,EV是最高的。

这里可能就会有杠精来问了,万一是个假的CA颁发的证书,所以CA怎么证明自己的身份呢?

当然是信任链,这里有点类似,DNS的域名查询。

小的CA可以让稍微大一些的CA签名,最终会到了ROOT CA,它是整个信任链的终点,你必须相信。

我们的操作系统和浏览器内置了各大根CA的证书,客户端收到了服务端发过来的证书,顺着证书链,一级一级向上验证,直到验证了根证书,就能证明客户端收到的证书是可信的,从而证书里面的公钥也是可信的。

6、不可否认

不可否认都是建立在前面三个特性基础上,实际上是人为引申出来的,比如你说过的话不能赖皮。怎么理解这个特性呢。我这里还是举个例子。

比如我说了一句话:"我喜欢金泫雅,我想跟她在一起"。我按照前面所说混合加密的方式发给了她,她收到了也信以为真。这时候她想跟我在一起,我却想反悔了,我死皮赖脸的就是不承认这句话是我说的,我非要说是小明说的。

对方很聪明,拿了几个证据:

1、我跟她建立通信,下发了我的数字证书,这个证书的是CA认证通过的,她拿出这个证据说,那句话就是我说的,不是小明说的。

2、我发给她的报文,附加上摘要,她拿到了原文计算出摘要,和我传给她的摘要对比了一下,没有被篡改。看!这就是你说的,内容没有被篡改,没有第三者诬陷我,这就是我本人的原话。

3、我和她加密、解密用的都是同一把密钥,别人不知道,所以别人怎么知道你对我说了什么话。

正因为有了前面三个特性的保障,实现了不可否认。所以我不能抵赖,最终我跟金泫雅在一起了。

七、主流程

讲完了,前面的知识点,相信大家一定对https的这套加密流程,有了一个七八成的认识了。这里我们串一下整个流程,让大家更清楚的认识到TLS的整个工作流程。

这里先做了一个伏笔。

在这之前,我们需要先介绍TLS的各个子协议。

记录协议(Record Protocol)规定了 TLS 收发数据的基本单位:记录(record)。它有点像是 TCP 里的 segment,所有的其他子协议都需要通过记录协议发出。但多个记录数据可以在一个 TCP 包里一次性发出,也并不需要像 TCP 那样返回 ACK。

警报协议(Alert Protocol)的职责是向对方发出警报信息,有点像是 HTTP 协议里的状态码。比如,protocol_version 就是不支持旧版本,bad_certificate 就是证书有问题,收到警报后另一方可以选择继续,也可以立即终止连接。

握手协议(Handshake Protocol)是 TLS 里最复杂的子协议,要比 TCP 的 SYN/ACK 复杂的多,浏览器和服务器会在握手过程中协商 TLS 版本号、随机数、密码套件等信息,然后交换证书和密钥参数,最终双方协商得到会话密钥,用于后续的混合加密系统。

变更密码规范协议(Change Cipher Spec Protocol),它非常简单,就是一个“通知”,告诉对方,后续的数据都将使用加密保护。那么反过来,在它之前,数据都是明文的。

听完这些枯燥的协议,直接来到我们本文的重点。

ECDHE的握手过程

这里有个注意点:

Client Params 和Server Params 都是各自生成的椭圆曲线公钥,客户端和服务端拿到这两个参数,通过ECDHE算法一算,算出了一个pre-master,其实也是一个随机数。

最终和前面的客户端随机数,和服务器端随机数生成一个master-secret的密钥,用于后面的对称加密算法。

听到这,我相信大家可能有很多想问的,当然按照本篇的惯例,即将废弃的握手流程,我在这里没有分享了,上面讲的是最新的握手流程。

八、总结

讲了刚才那么多知识,实际上是一个套娃的过程。

↓ 对称加密(有密钥交换的问题)

↓ 非对称加密(基于复杂的数学难题,运行速度很慢)

↓ 混合加密(怎么保证完整性?不被修改?)

↓ 摘要算法(无法保证是用户自己)

↓ 数字签名(公钥怎么保证安全正确的?)

↓ 数字证书、CA

九、附录

阮一峰:数字签名

chrono: 透视http协议

从上帝视角认识一下https相关推荐

  1. 刺激战场瞬灭助手 2019稳定版

    刺激战场瞬灭脚本防封版这是小编精心为广大的吃鸡大神带来的辅助脚本工具,为玩家带来稳定防封自瞄无后座方框透视开启,轻轻松松进决赛圈,上分必备软件,需要的用户赶快前来下载吧! 下载地址:阿里云cdn专用下 ...

  2. 上帝视角任意切换:三维重建和图像渲染是怎么结合的?

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 导读 本文介绍了3D图像网站Photo Synth及其前身Photo Tourism,并讲解了它们的两 ...

  3. 转载 程序员上帝视角解读“旅行青蛙”,你的呱真的在旅行嘛? (手机游戏)...

    程序员上帝视角解读"旅行青蛙",你的呱真的在旅行嘛? 2018-02-05 黄小秋 数据与算法之美 来源:知乎 作者:黄小秋 原文链接:https://www.zhihu.com/ ...

  4. 程序员上帝视角解读“旅行青蛙”,你的呱真的在旅行嘛?

    来源:知乎 作者:黄小秋 原文链接:https://www.zhihu.com/question/68733553/answer/305463907 导语:知乎有位程序员大佬,为了让老母亲老父亲们理解 ...

  5. 优云Monitor:开启数据中心主机运维的上帝视角

    常常有这么一句话在激励每一位运维人员,"不以故障多为耻,而以恢复快为荣."运维人员就是要快速定位问题,分析问题,排除故障,快速恢复来保障生产业务不受中断.然而,现代大型数据中心,运 ...

  6. 思科模拟器叫什么_宇宙无敌上帝视角无所不能之星球生成模拟器。

    众所周知啊,一些游戏的开发者们总喜欢做些小玩意发布在网上. 而这些游戏开发者制作的东西,有时候比他们的游戏更加有意思~不知道差友们有没有玩过一个叫 Bad North 的塔防游戏. 这款游戏的玩法非常 ...

  7. typescript的基本结构_上帝视角看 TypeScript

    点击蓝色"脑洞前端"关注我哟 加个"星标",带你揭开大前端的神秘面纱! ❝ 这是脑洞前端第「99」篇原创文章 TypeScript 的学习资料非常多,其中也不乏 ...

  8. 【JVM】上帝视角看JVM内存模型,分而治之论各模块详情

    1. 上帝视角 [树看JVM] [图看JVM] 2. 分而治之 2.1 堆区 构成:堆区由新生代和老年代组成,新生代中包含伊甸区(Eden).幸存者区(survivor from .survivor ...

  9. 真的有人能开启上帝视角,所有人在他眼里一览无余?

    真的有人能开启上帝视角,所有人在他眼里一览无余? 人的一双眼睛,一次能同时关注几个目标?有人经常搞不明白上帝视角,全局模式和沉浸模式. 人虽然有两只眼,能同时把注意力放到两部手机上么,还是一个一个看? ...

最新文章

  1. 工业互联网不只是网络:网络是基础,平台是关键
  2. 原始jdbc操作的分析
  3. 人名和成绩一起排序_#excel中怎么让人名和他的成绩一起排序#excle排序 怎么弄同名次...
  4. PAT_B_1008_Java(20分)
  5. LeetCode 287. 寻找重复数
  6. Spring和JSF集成:分页
  7. 3493. 最大的和
  8. STL~Deque简介
  9. spring发送邮件
  10. STM32工作笔记0025---理解并联电阻分流
  11. Eclipse启动时报错Java was started but returned exit code=13
  12. 博主已开启评论精选什么意思_什么叫独立站?
  13. 管理中的计算机应用0206,绩效管理那些事
  14. Lecture 008-Heuristic algorithms
  15. 程序员编程艺术第一~三十八章集锦与总结,及Github地址、PDF下载
  16. 十年内将被人遗忘的15种技术:硬盘和鼠标
  17. zbb20180619 mysql windows环境下MySQL重启的命令行说明
  18. 再造STM32---第二十二部分:CAN—通讯实验
  19. 结对编程之单元测试 201421123108 王坤彬
  20. 基于STM32单片机老人防跌倒报警系统GSM短信上报原理图PCB

热门文章

  1. Wordpress站点进阶1——简单的类微信排版导入
  2. 一级计算机视频教学百度网盘,2019年一级造价工程师教学视频百度云网盘分享...
  3. Openjudge 8465 马走日
  4. 欧洲杯第二周的比赛闲聊
  5. Android功能强大,UI 简洁,交互优雅的通用弹窗
  6. vue---vux详解
  7. 东西网创始人赵嘉敏:创业是一种重构
  8. oracle 行内容合并,[转]Oracle 多行的数据合并
  9. 下列选项html标记错误的是,网站美工设计师认证模拟练习题(二)
  10. 配置nginix代理