HTTPS 为什么是安全的 _ (下)

这篇具有很好参考价值的文章主要介绍了HTTPS 为什么是安全的 _ (下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有了这些前置知识,下面就来深入剖析 HTTPS 。

裸奔的 HTTP

为什么需要 HTTPS ?因为 HTTP 在裸奔

针对上篇文章中提到过的安全传输信息的几个要素:

  • 保证传输内容的安全,即不传输明文
  • 防止传输内容被篡改,即可以识别篡改
  • 确认对方真的是对方,即通信双方身份的认证

由于 HTTP 是 明文传输的 ,也没有提供身份验证的方式,任何人都可以在通信链路上的任意一个节点拦截,伪造通信内容。所以 HTTP 没有满足上面几条要素的任意一条,毫无安全性可言。在错综复杂的现代互联网环境下,无疑是行不通的,这也正是 HTTPS 得以迅速发展的原因。

Chrome 对于 HTTPS 链接会在地址栏显示绿色小锁;Android 9 开始默认启用 TLS,如果需要使用 HTTP,需要进行单独配置;iOS 强制使用 HTTPS ;HTTP/2 虽然仍然支持明文传输,但 Chrome,FireFox 公开宣布只支持加密的 HTTP/2;HTTP/3 (QUIC) 内置 TLS 1.3,只能进行加密通信 … 事实上,HTTPS 已经无处不在了。相信有一天,HTTP 将不复存在。

HTTPS = HTTP + ?

HTTP 将不复存在?这其实是个伪命题。事实上,HTTP 将永远存在。因为 HTTPS 并不是一个全新的产物,它是基于 HTTP 的。

我们回顾一下 TCP/IP 分层模型OSI 参考模型

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

OSI 参考模型对通信过程中必要的功能进行了归纳,但其只是一个模型,对各层的作用做了一系列粗略的界定。TCP/IP 协议分层与 OSI 参考模型略微不同,将传输层以上全部归为应用层。上图中的 TCP/IP 协议只分了四层,但一些资料中会将其分为五层,加上了物理层,倒也并不影响理解。

HTTP 属于应用层协议,它直接与用户交互,但并不负责真正的数据传输,它依赖于传输层协议 (一般是 TCP) 来将数据发送到对端。常见的传输层协议有 TCP 和 UDP 。同样,传输层也并不真正进行数据传输,它又依赖于网络层协议,一般是 IP 协议。网络层依赖链接层和物理设备进行真正的数据传输。正是得益于良好的分层结构,让我们可以很方便的实现 HTTPS 。

有这样一句广泛流传的话:计算机科学领域里的任何问题,都可以通过引入一个中间层来解决。(如果不行,那么就再来一层!) 用这句话来形容 HTTPS 是再适合不过了。

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

在原来的分层协议中,应用层直接将明文数据交给传输层来处理。而在 HTTPS 中, 应用层和传输层之间加了一层 TLS 来负责数据的加密,这样一来,应用层和传输层无需任何改变,就可以安全传输信息了。所以除了 HTTP,理论上任何应用层协议都可以基于 TLS 进行安全传输,例如 FTPS,SMTP…

TLS 的前身是 SSL 。SSL(Secure Sockets Layer) 是网景公司设计的安全传输协议,有 1.0,2.0,3.0 三个版本,但目前均已弃用。互联网工程组 IETF 将 SSL 标准化,并改名为 TLS 。1999 年 发布了 TLS 1.0,2006 年发布了 TLS 1.1,2008 年发布了 TLS 1.2,2018 年发布了 TLS 1.3 。每个新版本都强化了性能和安全性,目前使用最为广泛的是 TLS 1.2 ,之前的版本都将在今年被废弃。

说了半天 HTTPS ,那么它到底是如何运作的呢?我听很多朋友抱怨过,流程太复杂,看过一段时间就忘了。我在这里强烈建议大家用 wireshark 抓包分析一遍,再亲手画一个流程图,这样很容易就记住了。

认证 密钥协商 数据加密

HTTPS 的整体思路很简单,它其实就是做了三件事:认证、密钥协商、数据加密

  • 通信双方身份的验证

  • 通信双方协商出一个安全的会话密钥,注意中间人攻击的问题

  • 使用会话密钥对称加密通信内容

看起来很简单,但 HTTPS 做了大量的工作来保证通信的安全。下面就来实战抓包来学习 HTTPS 的通信流程。

HTTPS 通信流程

下文以浏览器访问 zhihu.com 抓取到的实际通信流程进行分析。

建立 TCP 连接

TLS 是基于 TCP 连接上建立的安全层,所以第一步 三次握手 (SYN => SYN, ACK => ACK) 建立 TCP 连接是必不可少的。

Client Hello

建立 TCP 连接之后,浏览器率先发出 Client Hello 消息。

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

挑几个重点字段说一下。

Version 表示客户端最高支持的 TLS 版本,向下兼容。上图中是 TLS 1.2 (0x0301)

Random 是客户端生成的一个随机数,后面用于生成主密钥。下文中用 client_random 表示。Random 是 32 字节,但其实随机数的长度是 28 字节,前面四个字节是 UNIX 时间戳,并没有什么意义。

Session ID 传递给服务器用于复用缓存的 TCP 连接。这里 Session ID 是有值的,但并不代表就一定会复用之前的连接,这要看服务器是否能找到该 Session ID 的连接。

Cipher Suites 是客户端支持的密码套件列表,服务器会从中选择合适的密码套件,排在第一个的优先选择。密码套件是 TLS 协议的核心,可以说它是保证 TLS 安全性的根本。密码套件决定了 TLS 使用的身份认证、密钥交换、对称加密、消息认证码的算法。在 TLS 1.2 中可选择的密码套件比较多,但在 TLS 1.3 中进行了删减,去除了部分不再安全的密码套件。

Compression Methods 表示客户端支持的压缩方法。由于存在安全性问题,一般不启用,值为 null 。

Extension 为扩展字段,可以让客户端和服务器在不更新 TLS 版本的基础上获取更多的能力。客户端可以发送服务端不理解的扩展,但服务端不能返回客户端无法理解的扩展,否则将发生错误。另外在 TLS 1.3 中,为了保证向下兼容性,并没有去修改 Version 字段,而是通过 Supported Version: TLS 1.3 这样的扩展字段来说明支持 TLS 1.3 。

Server Hello

服务端在收到 Client Hello 之后,根据客户端发来的消息内容,作出回应。

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

Version 表示服务器选定使用的 TLS 版本,上图中是 TLS 1.2 (0x0303)

Random 是服务器生成的随机数,其作用和 client_random 一样,也是用来计算主密钥,下文中用 server_random 表示。现在浏览器,服务器都拥有了 client_randomserver_random 两个随机数。

Session ID 为 null 表示服务器没有可复用的 TCP 连接。因为我模拟的第一次建立 TCP 连接的完整的 HTTPS 通信流程,所以必然是没有复用的。如果 Session ID 不为空的话,其实走的是一个连接的恢复流程,这样就抓不到完整的 HTTPS 流程了。后面可以简单演示一下。

Cipher Suite 表示服务端选定的密码套件是 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 。简单画个图分析一下。

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

后续的整个加密流程都会遵循该密码套件。

密钥协商算法 选定了 ECDHE (椭圆曲线迪菲-赫尔曼密钥交换) 。大多数资料中介绍的都是使用 RSA ,密钥协商算法的不同会导致后续通信流程的不同,后面会详细介绍。

身份验证算法 其实就是验证服务器证书签名的,这里是 RSA 。

对称加密算法 是用来加密通信数据的。

摘要算法 用于随机数生成以及 HMAC 算法。

Certificate

服务器在发送 Server Hello 之后,会立马发送服务器的证书链信息。其实 Certificate 和 Server Hello 是在同一个数据包里面的,以降低延迟。

下图是知乎服务器返回的证书链,可以看到有两张,zhihu.com 的服务器证书和中间证书。注意,根证书通常不包含在其中。因为根证书就在计算机中,没有必要再去传输。

两张证书的签名算法都是 sha256WithRSA ,公钥也返回给了客户端,客户端可以进行证书验证。验证不通过,就没有办法进行下面的交互了。


HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

暂停一下 …

下面的通信流程会因为密钥交换算法的不同,产生一些区别。所以这里先暂停一下,画张图总结一下上面的流程。

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

到目前为止,浏览器,服务器都持有了 client_randomserver_random 。浏览器也拿到了服务器的证书,可以对服务器进行身份认证。

接下来要做的就是协商密钥了。但这里协商的并不是会话密钥,而是一个叫做 pre_master 的预备主密钥。还记得服务端选定的密码套件吗?TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 ,该密码套件指定的密钥协商算法是 ECDHE ,这是目前比较常用的算法,另外还可以使用 RSA 进行密钥协商,现在已经不是很常用了,TLS 1.3 已经废弃了 RSA 密钥协商。但大多数文章中说的还都是 RSA 算法。

RSA 密钥协商很简单。浏览器生成一个随机数,使用服务器公钥加密之后发送给服务器,服务器接收之后使用自己的私钥解密拿到随机数。这个随机数就是 pre_master。但是这个方案不具备 前向安全性

在 TLS 握手阶段,中间人可以拿到 client_random, server_random 以及加密的 pre_master 。由于没有服务器私钥,中间人没有办法进行解密,只能将加密的历史通信数据保存下来。也正是因为服务器私钥是不会变化的,一旦通过社会工程学或者其他因素导致的私钥泄露,所有历史通信数据都会被破解。所以,最好的方案是一次一密。准确的说是,每个 TCP 连接都使用不同的密钥。这正是 ECDHE 密钥交换所能提供的特性。

知乎目前也是采用的 ECDHE 来协商密钥,继续分析下去。

Server Key Exchange

这是一条服务器发送给浏览器的消息。注意如果使用 RSA 生成 pre_master 的话,是没有这条消息的,因为不需要服务器再提供任何参数了。

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

我并不了解 ECDHE 的具体数学原理,只能大概阐述一下。服务端返回了 EC Diffie-Hellman Server Params ,可以理解为密钥交换服务器需要准备的参数,包括命名曲线,DH 公钥,签名信息等等。同样,浏览器也会准备需要的参数,一般就是一个 DH 公钥。双方利用这些公开的信息就可以协商出 pre_master。

这些参数中间人都可以拿到,但中间人是算不出 pre_master 的。关于具体的数学原理,你可以在网络上搜索一下 。

Server Hello Done

一条固定格式的消息,用来通知浏览器我该提供的都提供完了,你可以干你的事情了。

这里,我想问一个问题:Server Hello Done 消息发送完成之前,浏览器进行服务器证书校验了吗? 你可以思考一下。

答案是 没有。 因为 Server Hello 、Certificate、Server Key Exchange、Server Hello Done 这几条消息其实都是在同一个 TCP 数据包中的。拆分为多个包,只会徒增网络延迟。

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

Client Key Exchange

浏览器收到 Server Hello Done 之后会立马校验服务器证书。校验通过之后开始协商 pre_master 。

如果密钥协商算法是 RSA ,浏览器直接生成一个随机数,用服务器公钥加密发送过去即可。

知乎使用的是 ECDHE 来协商密钥,向服务器发送了 EC Diffie-Hellman Client Params ,如下图所示。这时候服务器、浏览器都拥有了 Server ParamsClient Params ,双方利用同样的信息计算出 pre_master

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

如何计算会话密钥 ?

目前为止,双方共同拥有的信息是 client_random、server_random、pre_master 。那么,如何计算出会话密钥呢?

首先,根据客户端随机数,服务器随机数,预备主密钥通过特定算法计算出 48 位的 主密钥(master_secret)。这个特定算法称为 密钥衍生算法,TLS 使用的密钥衍生算法叫做 PRF ,可以列一个简单的表达式:

master_secret = PRF(pre_master_secret , “master_secret” , client_random + server_random)[0…47] ;

PRF 函数有三个参数,**secret,label 和 seed **。client_random 和 server_random 合成了最后一个参数 seed 。由于计算机无法生成真正的随机数,client_random 和 server_random 的作用就是尽量提高随机性,保证不可预测。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

HTTPS 为什么是安全的 _ (下),程序员,https,安全,网络协议

最后

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!文章来源地址https://www.toymoban.com/news/detail-847950.html

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

到了这里,关于HTTPS 为什么是安全的 _ (下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么这么优秀的女生要找男程序员做老公?

    这篇文章呢我们谈一下 学计算机的男生这个问题 这个话题主要是来自于 有一个舞蹈老师 有一天跟我聊起来 说他的一个学生 长得非常漂亮是个女士 身材非常棒然后 在这边就是在温哥华这边呢 正在申请PR这个是没有问题的 有工作然后就想找一个程序员 老公那就是这样的一个

    2023年04月17日
    浏览(63)
  • 程序员为什么不喜欢关电脑?揭秘背后的原因与“英雄”本色

    在许多人眼中,程序员似乎总是与电脑形影不离,甚至深夜时分,他们的电脑屏幕也依旧亮着。那么,为什么程序员们似乎从不喜欢关电脑呢?今天,就让我们一起走进程序员的世界,揭秘这背后的原因,看看他们真正的“英雄”本色! 在程序员的日常工作中,保持流畅且不

    2024年02月19日
    浏览(59)
  • 程序员员为什么总是要加班呢?不加班会被开除吗?

    最近和圈子外的一个好朋友去聊天 他问我一个很奇怪的问题 就是你们程序员为什么会经常加班 并且都是11点12点才回家 为什么会这样 是因为有很多事情做不完吗其实 我半开玩笑的告诉他 其实事情没那么多 那为什么还要加班呢 首先加班的原因有很多 但是概述起来 就有如下

    2023年04月25日
    浏览(100)
  • ChatGPT出来后,为什么老有人想让我们程序员失业?

    🐱 个人主页: 不叫猫先生 ,公众号: 前端舵手 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏: vue3+vite+typeScript从入门到实践 📢 资料领取:前端进阶资料

    2024年02月07日
    浏览(54)
  • 为什么越来越多的人转行学IT当程序员?

    疫情当下,大学毕业生的人数越来越多,就业越来越困难,导致毕业生的就业压力越来越大。但就在这种“毕业即失业”的就业形势下,IT行业的从业者却拿着高薪,在所有行业中成为“佼佼者”。 为什么学IT的人越来越多? 01 行业发展前景,一直向上 我们的工作、生活和学

    2023年04月11日
    浏览(73)
  • 为什么有35岁「职业危机」的程序员不转做测试呢?

    针对这个问题,我想我还是有点发言权的,虽然我不是做开发,但是我老公是妥妥的程序员一枚,而我又是干测试的,所以我也会问他,为啥不转测试呀,测试相对不累,且工资也高于市面很多工作,即轻松又能赚钱,何乐而不为? 和老公交流过这个问题。交流后,我觉得要

    2024年02月10日
    浏览(50)
  • 人工智能这么厉害,比如GPT-4,为什么没有看到程序员失业?

    目录  一、一次理性的反思 看看网友基于GPT-4生成代码的测试案例: 二、人工智能与程序员相辅相成 三、无独有偶的低代码 1、提升开发价值 2、利于团队升级 四、最后 OpenAI发布了GPT-4,这个远超以往的任何人工智能的模型,在 逻辑、推理、数学、常识 等方面超越了90%的人

    2023年04月08日
    浏览(61)
  • 程序员日常|为什么我在开发工作中偏爱这款键盘?

    最近一直不断地有粉丝朋友们私信我,问我该如何给自己挑选一款适合程序员工作的键盘,于是今天来给大家介绍下我用的键盘。 程序员作为一个需要长时间敲代码的职业,没有一个趁手的键盘是不行的,往小了说是折损工作效率,往大了说就是在损伤自己的手,是对自己的

    2024年02月02日
    浏览(51)
  • 【为什么计算机老师不转行做薪资更高的程序员工作?】

    至于为什么一些计算机老师没有选择从事薪资更高的程序员工作,有很多原因。首先,人们的职业选择因素多样化,不仅仅取决于薪资。有些老师可能对教学工作有着浓厚的兴趣,并享受与学生交流和知识传授的过程。其次,不同的人对工作环境和工作内容有不同的偏好。有

    2024年02月09日
    浏览(42)
  • 为什么很多程序员不用switch,而是大量 的if......else if?

    不会吧还有人用if else和switch case?三目运算符? 不会吧? 不会吧?大佬都是全都不用的!以JAVA为例 条件判断语句的四种写法,茴字的四种写法大家不会不知道吧 1.正常人写法: //输出 :张三应该去男厕所 2.Lambda策略模式写法: 某些大公司P6级别以上(年薪30w-50w)标准写法

    2024年02月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包