这是一篇我写在“我就是程序员”的微信订阅号的里文章,原文的地址是:https://mp.weixin.qq.com/s/qgeFgO83uGoeuo__vkef9w


  为建立以安全为目的的HTTP通道,HTTPS应运而生。HTTPSHTTP通信建立连接的握手过程中多加了一次TLS握手,用于产生会话秘钥,用对称加密算法对会话的内容进行加密。


图解TLS握手过程

图中的女士Alise作为客户端向作为服务端的Bob发送请求,协商建立起HTTPS通话的过程:

TLS握手和算法


HTTPS的握手过程

TCP三次握手成功之后,开始建立TLS握手。这里我们主要分析HTTPS特别的一步,即TLS握手,主要分为三个阶段:参数协商、身份验证、**交换。具体过程如下:

TLS握手和算法


关于TLS握手过程,每一步骤的主要含义是:

  1. ClientHello: 一次新的握手中的第一条消息,将客户端的功能和首选项传送给服务器。

  2. ServerHello: 将服务器选择的连接参数传送给客户端。

  3. Certificate: 典型用于携带服务器X.509证书链。服务器必须保证它发送的证书与选择的算法套件一致。Certificate消息可选,因为并非所有的套件都使用身份验证,并非所有的身份验证都需要证书。

  4. ServerKeyExchange: 携带秘钥交换的额外数据。

  5. ServerHelloDone:表明服务器已经将所有预计的握手消息发送完毕,等待客户端发消息。

  6. ClientKeyExchange: 携带客户端为秘钥交换提供的所有信息。

  7. ChangeCipherSpec: 表明发送端已取得用以生成连接参数的足够信息,已生成加***,并且将切换到加密模式。客户端和服务器都会在条件成熟时发送这个消息。

  8. Finished: 意味着握手已经完成,消息内容将加密,以便双方可以安全的交换验证整个握手完整性所需的数据。


TLS握手的结果

握手过程中协商了本次请求使用的加密套件,以及使用套件中的算法进行证书校验、身份验证、秘钥交换,再利用秘钥交换产生的预主秘钥,使用对称加密算法计算出会话秘钥。

下图是密码套件的具体构成,包含了上述的四个算法。

TLS握手和算法

常用的密码套件有:

TLS握手和算法

为了深入的了解TLS握手过程,需要搞清楚算法在这里起到了什么样的作用,下面选每一类算法里基础的算法进行分析,加密强度可能会比现在使用的算法强度低,但从原理的角度并不影响理解。


信息摘要算法

信息摘要算法和数字签名算法配合使用,用于证书加密和认真,首先理解一下这两个算法使用场景:

TLS握手和算法

左半部分是服务端生成数字证书的过程:使用协商好的安全散列算法计算明文生成摘要,使用数字签名算法的私钥对证摘要加密,生成数字证书编号,和明文放在一起组成数字证书。

右半部分是客户端对数字证书认证的过程,客户端拿到数字证书后,一方面,使用协定的数字签名算法的公钥对证书编号解密,另一方面,再使用安全散列算法计算明文生成摘要,那这个摘要和解密处理的摘要比对,相等则认证通过,不相等则认证不通过。

下面首先讲一下,握手过程中用到的第一个算法,安全散列算法SHA1Secure Hash Algorithm),对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要:

TLS握手和算法

以上是对消息的完整的计算过程,大体上可以分为三步:一是对消息分组和填充,二是对每组数据计算,三是把计算的结果再进行分组处理,得到最终的160比特。

填充分组:把最长为264比特的消息进行填充,使其长度为512比特的倍数,然后每512比特为一组。

分组计算:把每组的512比特分解为1632比特,再对这16个初始值W0~W15,异或操作,生成W16~W79,一共80个值。计算过程如下:

TLS握手和算法


分组处理:用一个初始值和第1组的结果进行分组处理,处理的结果再和第2组的结果分组处理,依次进行80步,这里的每一步的计算过程是:

TLS握手和算法


在这个过程中,第一步的A,B,C,D,E是缓冲区初始值,和第一组的W0~W79的值,根据不同的步骤计算规则,处理成一个新的A,B,C,D,E用于后续的计算。

复杂的异或过程,输入的明文中改变一位消息数据会使输出值大幅度变动,使SHA1算法呈现雪崩效应与不可逆性,保证了验证数据完整性与消息验证。


数字签名算法

数字签名算法以RSA为例:

公钥(E,N

N : 两个素数pq的乘积 (pq必须保密)

E : (p-1)(q-1)互质   

私钥(D,N

D : E相当于Φ(N)的模反元素

N : (与公钥使用相同的数N)

加密

密文 = 明文E modN

解密

明文 = 密文modN


加密解密的公式看起来很简单,但是这几个数字之前存在着质数的性质和欧拉函数的计算,可以保证

已知E,N,却很难推导出D

因为E*D ≡ 1(modΦ(N)),由于N为两个素数的乘积,

所以E*D ≡ 1 (mod(p-1)(q-1))

所以,需要将N因数分解为pq,只要N足够大(1024),很难将D计算出来。


**交换算法

DH算法为例,在TLS握手的过程中,客户端和服务端会传递DH计算所需的参数:

TLS握手和算法

发送的具体数字如下:

规则

客户端

服务端

只有自己知道的数字

1  ~ p-2之间的整数A

1  ~ p-2之间的整数B

发送给对方的数字

GAmodP

GBmodP

计算预主**

(GBmodP)AmodP

=  GA*BmodP

(GAmodP)BmodP

=  GA*BmodP

其中PG是一对生成元。整个过程,可窃听的数字有,可窃听的数字:PGGAmodPGBmodP,根据生成元的数学性质,通过GAmodP计算出A的有效算法到现在还没出现,没有AB,要推算GA*BmodP很难。

DH算法解决的是,通过公共信道交换一个信息,就可以创建一个可以用于在公共信道上安全通信的共享**。这样,客户端和服务端拿到了生成会话**的关键数字预主**,再加上之前交换得到的客户端随机数和用户端随机数,各自计算出会话**,开始加密对话。

对称加密算法

相对于非对称加密算法,对称加密算法计算量小、加密速度快、加密效率高,所以在握手之后,在会话过程中使用的加密算法就是对称加密算法了。以AES_128算法为例, AES为分组密码,把明文分成一组一组的,每组长度为128位,不足128位的会使用补数据的规则补齐128位,分别对每一组加密,直到加密完整个明文。具体的计算过程如下:

TLS握手和算法


计算过程中,每一组数据会把128位按字节处理,即16个字节,经历的10轮的计算,除了第10缺少一步列混合计算,每一轮计算都包括4个步骤:字节代换、行移位、列混合、轮秘钥加。下面分别介绍每个步骤:

字节代换:

TLS握手和算法


AES定义了一个S盒和逆S盒,把状态元素中的每个元素映射为S盒中的一个新的值,替换掉原有的值。

行移位:

TLS握手和算法

这是一个简单的左循环移位操作。

列混合:

TLS握手和算法


与一个固定的矩阵相乘,得到一组新的矩阵,新的矩阵的第j(0j3)的列混合计算如下所示:

TLS握手和算法

轮秘钥加:

TLS握手和算法

其中,**Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]32位比特字,包含4个字节。轮**加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3 组成的32位字与W[4i]的异或运算,i10轮计算中的第几轮。

初始秘钥产生的W[0],W[1],W[2],W[3]只用在第一轮之前的轮秘钥加操作中,后面10次轮秘钥加操作用到的W[4i]~ W[4i](i取值110)都是经过秘钥扩展算法产生的。如下所示:

TLS握手和算法


其中,T是一个复杂的函数计算。

TLS握手和算法

Spring IOC容器实现原理分析

java8日期时间前世今生

一文理解mysql的索引

一种基于业务的MQ消息路由方案

B2C药品预约单重构

B2C药品预约单派单服务架构设计

京东互联网医院预约服务设计

一种简单可行的abTest流量切换实现方案

理解 Koa 框架中间件原理

京东互联网医院平台架构实践

聊聊全局服务ID-Snowflake

DDD指导系统架构设计

闲谈软件开发


欢迎加群沟通:

TLS握手和算法


相关文章:

  • 2021-10-07
  • 2021-08-01
  • 2022-01-27
  • 2022-12-23
  • 2022-12-23
  • 2021-04-15
  • 2021-06-14
猜你喜欢
  • 2021-12-26
  • 2021-07-21
  • 2021-11-05
  • 2021-04-22
  • 2021-08-07
  • 2021-08-11
相关资源
相似解决方案