一步一步分析HTTPS加密机制
一步一步分析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: https://zhuanlan.zhihu.com/p/43789231
CA,证书,公钥,私钥,加密算法常识总结: https://www.cnblogs.com/yb38156/p/14293382.html
一步一步分析HTTPS加密机制的更多相关文章
- 白话HTTPS加密机制
在讲主题之前,我们先来区分两个概念:签名和加密有什么区别? 我们从字面意思看: 签名就是一个人对文件签署自己的名字,证明这个文件是我写的或者我认可的,所以只要别人看到我的签名,认识我字迹的人就知道这个 ...
- HTTPS 加密机制
目录 1. HTTPS 概述 2. 对称加密 3. 非对称加密 4. 非对称加密改良方案 5. 非对称加密 + 对称加密 6. 中间人攻击 7. 数字证书 8. 数字签名 9. HTTPS 工作原理 ...
- HTTPS通信机制
概述 使用HTTP协议进行通信时,由于传输的是明文所以很容易遭到窃听,就算是加密过的信息也容易在传输中遭受到篡改,因此需要在HTTP协议基础上添加加密处理,认证处理等,有了这些处理机制的HTTP成为H ...
- 一步一步pwn路由器之wr940栈溢出漏洞分析与利用
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...
- 简单几步让网站支持https,windows iis配置方式
1.https证书的分类 SSL证书没有所谓的"品质"和"等级"之分,只有三种不同的类型.SSL证书需要向国际公认的证书证书认证机构(简称CA,Certific ...
- 简单几步让网站支持https,windows iis下https配置方式
1.https证书的分类 SSL证书没有所谓的"品质"和"等级"之分,只有三种不同的类型.SSL证书需要向国际公认的证书证书认证机构(简称CA,Certific ...
- 一步一步实现kbmmw的httpsys使用https功能
kbmmw的httpsys的功能已经实现了好长时间,但是现在各个平台都要求使用https来提供服务. 今天一步一步来说一下如何使用kbmmw 的httpsys功能支持https. 首先为了获得证书,我 ...
- 一步一步学Vue(六)https://www.cnblogs.com/Johnzhang/p/7242640.html
一步一步学Vue(六):https://www.cnblogs.com/Johnzhang/p/7237065.html 路由 一步一步学Vue(七):https://www.cnblogs.com ...
- HTTPS加密原理与过程
HTTPS加密原理与过程 HTTP 超文本传输协议一种属于应用层的协议 缺点: 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡 ...
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
随机推荐
- 痞子衡嵌入式:不同J-Link版本对于i.MXRT1170连接复位后处理行为有所不同
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是不同J-Link版本对于i.MXRT1170连接复位后处理行为. 痞子衡之前写过一篇旧文 <i.MXRT1170上用J-Link连 ...
- 从零开始写 Docker(十六)---容器网络实现(上):为容器插上”网线”
本文为从零开始写 Docker 系列第十六篇,利用 linux 下的 Veth.Bridge.iptables 等等相关技术,构建容器网络模型,为容器插上"网线". 完整代码见:h ...
- swift_slowAlloc Crash 分析
一.Crash详情 Crash类型 exception EXC_BREAKPOINT (SIGTRAP) reason EXC_BREAKPOINT EXC_ARM_BREAKPOINT fault_ ...
- itestwork(爱测试) 开源一站式接口测试&敏捷测试工作站 9.0.2Rc2发布
(一)itest 简介 itest work (爱测试) 一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest work 包 ...
- Java 集合的概念
目录 集合 单列集合(Collection) Collection中的一些方法 public static < T > boolean addAll(Collection<? sup ...
- Linux扩展篇-shell编程(四)-shell条件判断
基本语法 格式一: test condition 格式二: [ condition ] 注意:1)condition前后要有空格.2)条件非空即为true,例如[ hello ]返回true,[ ]返 ...
- The sultion of P4959
problem & blog 首先我们看到 \(x,y\) 有可能为负数,所以我们先把它旋转到第一象限. 然后我们发现如果 \(x_a \ge x_b\) 且 \(y_a \ge y_b\) ...
- C# .NET HttpWebRequest 显示指定SSL TLS 版本
C# .NET HttpWebRequest 显示指定SSL TLS 版本 (TLS1.0,TLS1.1,TLS1.2) 在程序启动时加入这段代码: ServicePointManager.Secur ...
- 使用Git命令从本地上传到码云
Gitee创建仓库内没有内容 本地: 初始化Git仓库:git init 提交文件到暂存区:git add . //. 表示提交所有文件 提交文件到工作区:git commit -m "此次 ...
- leetcode_2-两数相加_javascript
题目 2.两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新 ...