一步一步分析HTTPS加密机制

HTTPS(SSL/TLS)的加密机制虽然是大家都应了解的基本知识, 但是更多的时候我们只是在背诵一些概念, 比如: "对称加密", "非对称加密", "数字证书". 但是我们很少去思考 "为什么". 本文围绕 "为什么" 展开, 一步一步解开 HTTPS 的面纱.

为什么要加密?

因为http的内容是明文传输的,明文数据会经过中间代理服务器、路由器、wifi热点、通信服务运营商等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉,这就是中间人攻击。所以我们才需要对信息进行加密。最容易理解的就是对称加密。

什么是对称加密?

对称加密的要点是: 加密和解密只需要1个秘钥

下面是对称加密的伪代码

密文 = encode(明文, 秘钥)
明文 = decode(密文, 秘钥)

对称加密的步骤是什么?

对称加密的步骤如下:

  • 小明和小红协商一个秘钥
  • 小明使用秘钥加密数据, 发送密文
  • 小红使用秘钥解密密文, 得到明文

对称加密示例-简单替换密码

简单替换密码系统中,我们为26个字母建立映射关系,例如s->a、c->d、h->n、o->x、l->y…… 26个字母被影射为另外的字母,那么一个明文的单词被加密后就无法认出了。例如school,按照上面的映射关系,就变成了adnxxy。

在这个密码系统中也存在密码算法和密钥。

  • 密码算法:26个字母按照固定的映射关系做替换

  • 密钥:26个字母的替换关系

如果想要破解密钥,也就是要找出26个字母的替换关系。a有26种替换可能,b有除a选择替换的字母之外的25种可能。以此类推,存在的替换关系有26x25x24……x1,约为2的88次方。如果计算机可以一秒尝试一亿个密码,运气差的话要尝试1200亿年。因此暴力破解是行不通的。

但是由于密码算法中,替换关系是稳定的,所以可以采用频率分析的方式破解密码。原理是明文中同一个字母出现的频率和密文中被替换的字母出现的频率一致。在英文中,字母出现的频率是相对稳定的。因此可以根据字母出现的频率推算出替换关系,也就是密钥。从而完成破解。

由此可见这种密码系统不安全的根源在于密码算法,该算法很容易让破解者推测出密钥,因此安全性极低。

对称加密示例-AES

AES 示例比较复杂, 是生产环境中常用的加密算法, 可以考虑跳过该部分

AES(advanced encryption standard) 算法是经过公开选拔所产生。这样彻底杜绝了 "隐蔽式安全性"。最终,比利时密码学家 Joan Daemen 和 Vincent Rijme 开发的密码算法 Rijndael成为了 AES 标准。

AES 所支持的 Rijndael 密码算法,分组长度为 128 比特,密钥长度有 128、192、256比特三种选择。

AES 算法也有多个轮次,每轮次有如下四个步骤:

  • SubBytes
  • ShiftRows
  • MixColumns
  • AddRoundKey

SubBytes:

类似于简单替换,将每个字节的值替换为另外的值。

ShiftRows:

首先将明文以4字节为一行,转化为多行,也就是矩阵。每行按照一定规则向左平移

MixColumns:

将矩阵的列,每4个字节为单位进行比特运算,转化为另外的4字节值。

AddRoundKey:

将 MixColumns 后的数据与轮密钥进行 XOR 运算。

以上四步执行完后,一轮 Rijndael 加密就结束了。Rijndael 加密一般要进行 10-14 轮计算。

Rijndael 解密的过程则是相反的顺序:

  • AddRoundKey
  • MixColumns
  • ShiftRows
  • SubBytes

Rijndael 加密的过程有点像玩魔方。假如有种魔方,除了和普通魔方相同之处外,每个格子还写有文字。Rijndael 加密的过程和打乱这个魔方非常像。横着转几下,竖着转几下。除了打乱行、列,还对格子里的值做了替换以及 XOR 加密。

而 Rijndael 解密的过程就是还原魔方,只不过不但颜色要还原一致,魔方格子上的文字也要还原。 你是否担心会玩魔方的人很容易就能复原?由于AES中使用了密钥,所以即使精通AES算法,拿不到密钥也很难还原。

切记不要试图自己开发加密算法,通过隐藏加密算法的方式来提高安全性。要杜绝隐蔽式安全性。没有特殊情况,我们都应该首选 AES。

对称加密问题是什么?

对称加密的问题在于第一步: 协商秘钥

如果小明将将秘钥发送给小红, 黑客就可以在网络线路上截获秘钥, 这样黑客就可以解密所有的数据了

有如下几种解决密钥配送问题的方案:

  • 事先共享密钥: 比如小明和小红私下交换秘钥
  • 密钥分配中心: 比如小明和小红将秘钥发送给密钥分配中心, 然后密钥分配中心将秘钥发送给小明和小红
  • 非对称加密

下面主要介绍一种解决方案: 非对称加密

什么是非对称加密?

非对称加密的要点是: 加密和解密需要2个秘钥

公钥加密数据, 私钥解密数据

非对称加密的伪代码如下:

密文 = encode(明文, 公钥)
明文 = decode(密文, 私钥)

注意CA机构是相反的: 私钥签名, 公钥验证签名

非对称加密的密码学实现比较复杂, 这里不赘述

非对称加密的步骤是什么?

一共4个秘钥,小红有私钥和公钥, 小明有私钥和公钥

  • 小明将公钥发送给小红, 小红将公钥发送给小明
  • 小红使用小明的公钥加密数据, 发送密文
  • 小明使用自己的私钥解密密文, 得到明文

非对称加密的效率问题?

非对称加密算法非常耗时,而对称加密快很多, 一般的方案是: 使用非对称加密算法交换对称加密的密钥, 然后使用对称加密算法加密数据

非对称加密的安全问题?

黑客无法获取内容, 但是黑客可以拦截伪造

小明和小红的公钥都在网络中传输过, 黑客就可以在网络线路上截获公钥和密文, 但是黑客没有私钥, 黑客无法解密内容

但是黑客可以拦截伪造

比如小明登录网站, 黑客拦截了小明对网站的登录请求, 然后黑客将自己的公钥发给了小明, 小明用黑客的公钥加密了账号和密码发给了黑客, 黑客用自己的私钥解密, 就获得了小明的账号密码

所以 你怎么鉴别别人给你的公钥是对的?

下面介绍一种解决方案: 证书

证书是什么?

证书解决公钥的信任问题, 由权威机构告诉你你手上的公钥是这个网站的, 而不是黑客伪造的

请记住一句话: 公钥加密,私钥解密;私钥签名,公钥验签

证书的步骤是什么?

  • 网站生成网站公钥和网站私钥
  • 网站将自己的公钥(明文数据)交给权威机构认证(一般是域名的管理员才能通过认证)
  • CA机构对证书明文数据T进行hash
  • CA机构对hash后的值用私钥加密(不同之处在于CA机构用私钥加密, 公钥解密),得到数字签名S, 证书=明文数据+数字签名
  • 用户下载的浏览器都默认安装了主流CA机构的公钥, 用户从网站下载证书后通过机构公钥解密证书的签名, 然后对证书明文数据进行hash, 如果hash值和签名一致, 证明证书是CA机构签发的, 证书是可信的.
  • 用户通过网站的公钥(也就是证书中的明文数据), 对明文进行加密, 发送密文
  • 网站通过自己的私钥对密文进行解密, 得到明文

总之就是: 通过加了一层机构来保证公钥的正确性

为什么CA机构对明文加密前要先hash?

如果直接对明文加密, 会很慢, 所以先对明文进行hash, 然后对hash值进行加密, 这样速度会快很多

机构是干嘛的?

机构的工作主要就是认证证书的生成和管理

生成证书

负责认申请人的身份, 一般是域名所有人, 认证通过后生成证书

管理证书

如果网站的私钥被泄露了, 网站需要将改证书作废, 重新生成新的证书

机构是哪个国家的?

权威机构有几个公司, 浏览器默认都安装了他们的公钥, 大部分都是美国的

跟域名, IP地址一样, CA证书也是互联网的资源, 可以用来卡脖子.

有一个知乎问答: 西方机构吊销了俄罗斯的HTTPS证书有什么影响吗?https://www.zhihu.com/question/523817733/answer/2440936723

如果黑客伪造了机构的的证书呢?

我们怎么知道机构一定是可信任的呢, 我们应该信任哪家机构呢, 如果黑客伪造了机构的的证书呢?

核心要点是: 我们最终选择相信根CA

  • 浏览器内置了一些根CA, 一般是国家级的机构, 比如: Verisign, Thawte, GeoTrust, Comodo, DigiCert, Entrust, GlobalSign, GoDaddy, Network Solutions, Symantec, etc.
  • 根CA可以给及其他机构或者网站颁发证书
  • 其他机构可以给其他机构或者网站颁发证书
  • 但是最终一定是能追溯到根CA, 我们默认根CA是可靠的(只要浏览器软件是可靠的, 不要下盗版的软件, 另外我们也可以自己安装CA到设备中)

你仍旧不信任根 CA?抱歉,你也只能信任根CA。

HTTPS是什么?

上面介绍了, 对称加密, 非对称加密, 证书. 把它们结合起来, 解决效率和安全性的问题, 这就是 https

参考资料: https://blog.csdn.net/odyyy/article/details/80256129

reference

密码学: https://icodebook.com/

HTTPS: https://zhuanlan.zhihu.com/p/43789231

CA,证书,公钥,私钥,加密算法常识总结: https://www.cnblogs.com/yb38156/p/14293382.html

一步一步分析HTTPS加密机制的更多相关文章

  1. 白话HTTPS加密机制

    在讲主题之前,我们先来区分两个概念:签名和加密有什么区别? 我们从字面意思看: 签名就是一个人对文件签署自己的名字,证明这个文件是我写的或者我认可的,所以只要别人看到我的签名,认识我字迹的人就知道这个 ...

  2. HTTPS 加密机制

    目录 1. HTTPS 概述 2. 对称加密 3. 非对称加密 4. 非对称加密改良方案 5. 非对称加密 + 对称加密 6. 中间人攻击 7. 数字证书 8. 数字签名 9. HTTPS 工作原理 ...

  3. HTTPS通信机制

    概述 使用HTTP协议进行通信时,由于传输的是明文所以很容易遭到窃听,就算是加密过的信息也容易在传输中遭受到篡改,因此需要在HTTP协议基础上添加加密处理,认证处理等,有了这些处理机制的HTTP成为H ...

  4. 一步一步pwn路由器之wr940栈溢出漏洞分析与利用

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...

  5. 简单几步让网站支持https,windows iis配置方式

    1.https证书的分类 SSL证书没有所谓的"品质"和"等级"之分,只有三种不同的类型.SSL证书需要向国际公认的证书证书认证机构(简称CA,Certific ...

  6. 简单几步让网站支持https,windows iis下https配置方式

    1.https证书的分类 SSL证书没有所谓的"品质"和"等级"之分,只有三种不同的类型.SSL证书需要向国际公认的证书证书认证机构(简称CA,Certific ...

  7. 一步一步实现kbmmw的httpsys使用https功能

    kbmmw的httpsys的功能已经实现了好长时间,但是现在各个平台都要求使用https来提供服务. 今天一步一步来说一下如何使用kbmmw 的httpsys功能支持https. 首先为了获得证书,我 ...

  8. 一步一步学Vue(六)https://www.cnblogs.com/Johnzhang/p/7242640.html

    一步一步学Vue(六):https://www.cnblogs.com/Johnzhang/p/7237065.html  路由 一步一步学Vue(七):https://www.cnblogs.com ...

  9. HTTPS加密原理与过程

    HTTPS加密原理与过程 HTTP 超文本传输协议一种属于应用层的协议 缺点: 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡 ...

  10. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

随机推荐

  1. vivo 制品管理在 CICD 落地实践

    作者:vivo 互联网效能平台团队 - Chen Lingling 在DevOps实践中,制品管理是一个重要的组成部分,它可以帮助团队快速交付高质量.高可靠性的软件,本文将介绍在 DevOps 领域, ...

  2. itest(爱测试) 开源接口测试,敏捷测试管理平台10.2.3发布

    一:itest work 简介 itest work 开源敏捷测试管理,包含极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock,还有压测 ,又有丰富的统计分析,8合1工作站.可按 ...

  3. vmware vmnat1和vmnat8在真机网络适配器中消失

    在真机的网络适配器中,发现只有两张网卡.缺少vmnat1和vmnat8 一,查看虚拟网络编辑器是否连接 二,如果没有连接,勾选连接就好了. 三,如果连接了,真机网络适配器仍然只有两张网络适配器. 1. ...

  4. lazyload图片懒加载

    安装 npm i -S vue-lazyload 在src/main.js文件中添加如下内容 import VueLazyload from 'vue-lazyload' Vue.use(VueLaz ...

  5. ABC336

    E 数位 dp. 定义 \(dp_{pos,s,t,0/1}\) 为在第 \(pos\) 位,当前数字和是 \(s\),这个数模规定的数字和为 \(t\),是 \(/\) 不是极限的情况数. 于是我们 ...

  6. Prometheus 聚合查询的两个方案

    问题背景 多个 Prometheus 集群或者多个 VictoriaMetrics 集群,在 Grafana 和夜莺里通常需要创建多个不同的数据源,这也就意味着,数据没法聚合查询,比如统一做一下 su ...

  7. rsync备份

    备份工具rsync 备份是太常见.且太重要的一个日常工作了. 备份源码.文档.数据库.等等. 类似cp命令拷贝,但是支持服务器之间的网络拷贝,且保证安全性. 学习背景 超哥游戏公司要每天都要对代码备份 ...

  8. 《编译原理》阅读笔记:p18

    <编译原理>学习第 3 天,p18总结,总计 14页. 一.技术总结 1.assembler (1)计算机结构 要想学习汇编的时候更好的理解,要先了解计算机的结构,以下是本人学习汇编时总结 ...

  9. Python_12 多继承与多态

    一.查缺补漏 1. self和super的区别:self调用自己方法,super调用父类方法 当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找 而当使用 super ...

  10. Linux内存不够了?看看如何开启虚拟内存增加内存使用量

    1.为什么要使用虚拟内存 当我们没有多余的钱去购买大内存的云服务器时,但是当前服务器里面的软件和程序运行的比较多导致内存不够用了.这个时候可以通过增加虚拟内存来扩大内存容量.但是在启用虚拟内存时,需要 ...