深刻TLS/SSL协议

整体

TLS/SSL协议是为了解决网络通信中的信息安全问题而诞生的。git

它的设计目的主要有三个:github

  • 身份验证——搞清楚与我通信的人是否是我所想的那个。
  • 保密性——就算第三方拿到了通信内容,也搞不清楚其中所表达的意思。
  • 完整性——保证通信内容的完整性。

TLS/SSL协议主要包含两部分:
一、Record记录协议算法

  • 使用对称加密算法来解决通信消息加密的部分。

二、Handshake握手协议浏览器

  • 为了完成对称加密,须要经过握手协议来传递密钥。

对称加密

对称加密算法是指在加密和解密过程当中使用相同的密钥。安全

举例:
张三在与李四通信时为了防止第三方窃听,使用莫斯密码将通信内容加密。李四接收到通信内容后,使用相同的莫斯密码将内容解密。网络

由于使用了相同的莫斯密码,因此这属于对称加密。dom

网络通信中的对称加密之因此可以使用相同的密钥对内容进行加/解密,是由于使用了异或运算。函数

异或运算

在数学领域中异或运算:当两两数值相同为否,而数值不一样时为真。网站

在计算机领域中的异或运算: 加密

举例:
现有一把密钥:1010,与明文:0110。

一、使用密钥对明文进行加密,得出密文为:1100

  • 1 XOR 0 = 1
  • 0 XOR 1 = 1
  • 1 XOR 1 = 0
  • 0 XOR 0 = 0

二、使用相同的密钥对密文进行解密,得出明文:0110

  • 1 XOR 1 = 0
  • 0 XOR 1 = 1
  • 1 XOR 0 = 1
  • 0 XOR 0 = 0

可见XOR异或运算是对称加密的关键!

优势:

  • 异或运算执行速度很是快,只需遍历一遍就能够了。

缺点:

  • 要求进行异或运算的密钥与明文长度要一致的。明文有大有小,大到能够是几百兆甚至是几个G,要求密钥是一样的大小是不可能的。

填充

异或运算要求双方长度一致的这个缺点要怎么解决呢?聪明的同窗或许已经想到解决方法了:就是将明文划分为多个等长的块。

好比密钥为16字节的,那就将明文划分为多个16字节的块,分别用密钥对这些明文块进行加解密。

Block cipher分组加密原理就是这样:将明文划分为多个等长的Block块,对每个Block块分别加解密。

但并非全部的明文都能刚好的划分为16字节的块。这时就须要填充!

填充的目的:

  • 当最后一个明文Block块的长度不足时,就须要填充。

填充主要有两种方法:

  • 位填充:以比特位为单位进行填充。
  • 字节填充:以字节为单位进行填充。

其中字节填充有4种填充方式:

  • 补零--最后不足的字节所有填上0。
    好比以16字节划分,最后一个Block块只有12个字节,那么就填入00 00 00 00。
  • ANSI X9.23--也是补零,只是在最后一个字节填写说明须要填充多少个字节。
    好比以16字节划分,最后一个Block块只有12个字节,那么就填入00 00 00 04。
  • ISO 10126--填随机数,在最后一个字节填写说明须要填充多少个字节。
    好比以16字节划分,最后一个Block块只有12个字节,那么就填入45 A3 D2 04。
  • PKCS7--须要填充多少个字节,就填写多少。
    好比以16字节划分,最后一个Block块只有12个字节,那么就填入04 04 04 04。

工做模式

对明文进行分组、填充后,还要按照必定的规律或方法进行加/解密。这些规律或者方法就是工做模式。

分组工做模式:block cipher mode of operation

  • 容许使用用一个分组密码密钥对多于一块的数据进行加密,并保证其安全性。

一、 电子密码本ECB模式--Electronic codebook
就是直接将明文分解为多个块,对每一个块进行加密。

这种工做方法很是简单、快速。可是缺点在于一样的明文块会被加密成相同的密文块;所以,它不能很好的隐藏数据模式。

举例:
对图片进行ECB以后,是没法隐藏到图像的轮廓特性的。以下图所示:

二、密码分组连接CBC模式--Cipher-block chaining
每一个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每一个密文块都依赖于它前面的全部明文块。同时,为了保证每条消息的惟一性,在第一个块中须要使用初始化向量。

它的主要缺点在于加密过程是串行的,没法被并行化。

三、计数器模式CTR模式--Counter
CTR将块密码变为流密码。它经过递增一个加密计数器以产生连续的密钥流,其中,计数器能够是任意保证长时间不产生重复输出的函数。
这样加密和解密过程都可以进行并行处理并且加密效果也很是理想。

CTR模式一样存在问题:没法提供密文的完整性校验。当密文在传输过程当中存在丢失的状况下,是没法保证密文的完整性的。

完整性校验

MAC算法--Message Authentication Code
MAC算法可以实现消息的完整性校验。工做原理是基于hash函数的。

hash函数是一种从任何一种数据中建立小的数字“指纹”的方法。hash函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。
简而言之就是:不管输入多长的字符串,经过hash函数,都能获得定长较短的字符串。

MAC工做流程如图所示:

  • 发送方使用密文与密钥经过MAC算法生成一个MAC序列。而后将密文与MAC序列值一块儿打包发送。
  • 接收方拿到以后,将密文与密钥使用相同的MAC算法也生成一个MAC序列。而后比对这两个MAC序列是否相同。

CTR分组工做模式加上MAC算法就诞生了GCM分组工做模式。

AES对称加密算法

高级加密标准AES算法--Advanced Encryption Standard

  • 经常使用的填充方法:PKCS7
  • 经常使用的分组工做模式:GCM

AES的分组Block块长度固定为128比特,也就是16字节。
密钥长度则能够是128,192或256比特。

AES加密过程是在一个4×4的字节矩阵上运做。
因此从上图中看出,分组长度128比特分为4个32比特。而不一样长度的密钥则分为四、六、8组32位比特的矩阵。

AES加密流程:如图所示


10轮加密可分为初始轮、普通轮和最终轮。
一、初始轮

  • AddRoundKey轮密钥加

二、普通轮

  • AddRoundKey轮密钥加
  • SubBytes字节替代
  • ShiftRows行移位
  • MixColumns列混合

三、最终轮

  • SubBytes字节替代
  • ShiftRows行移位
  • AddRoundKey轮密钥加

addRoundKey轮密钥加

  • 矩阵中的每个字节都与该次回合密钥(round key)作XOR运算;每一个子密钥由密钥生成方案产生。

SubBytes字节替代

  • 透过一个非线性的替换函数,用查找表的方式把每一个字节替换成对应的字节。

ShiftRows行移位

  • 将矩阵中的每一个横列进行循环式移位。

MixColumns列混合

  • 为了充分混合矩阵中各个直行的操做。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另外一个AddRoundKey取代。

非对称密码

对称加密的最大的问题是怎么把密钥传递给对方。非对称密码能够实现密钥的安全传递。

每个参与方都有一对密钥:

  • 公钥--对对方公开
  • 私钥--仅本身拥有

非对称加解密过程:

  • 使用对方的公钥加密
  • 使用本身的私钥解密

举例:
张三要和李四通信
第一步:张三用李四的公钥进行加密,将密文发送给李四。
第二步:李四用本身的私钥进行解密。

密文是没法经过公钥解密的,只有私钥才能解密。

张三怎么拿到李四的公钥?有两种办法:

  • 第一种:经过PKI公钥基础设施拿到的。
  • 第二种:创建连接过程当中经过握手过程由李四传给张三的。

RSA算法

RSA是基于公开密钥密码体制的。

公开密钥密码体制是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

RSA算法中公私钥的产生:

  • 随机选择两个不想等的质数pq
  • 计算pq的乘积n(明文小于n)。
  • 计算n的欧拉函数v, v=(p-1)*(q-1)
  • 随机选择一个整数e,且1<e<v,kv是互质。
  • 计算e对于v的膜反元素d(d * e)%v = (e * d)%v = 1
  • 公钥:(e, n)
  • 私钥:(d, n)

RSA的安全性依赖于大数因数分解很是很是困难,也就是经过一个大数n是很是难的分解出pq

RSA算法的加解密流程:以下图所示

  • 加密
    m是明文,c是密文
  • 解密

因为进行大量的大数乘法运算,RSA的速度是对应一样安全级别的对称密码算法的1/1000左右。

PKI公钥基础设施

PKI是非对称密码学的一个很是重要的应用。

基于私钥加密,只能使用公钥解密的原理实现身份验证的做用。

签名与验签的流程

  • 首先网站站长经过RSA算法生成一对公私钥,而后将公钥与站长的我的身份发送给Certificate Authority数字证书认证机构
  • CA机构核实完我的信息后就对这些信息使用CA机构的私钥进行加密生成一个公钥数字证书
  • 而后将这个公钥数字证书颁发给站长。公钥数字证书的组成:CA信息、公钥用户信息、公钥、权威机构的签名和有效期。

具体的流程:如图所示
签名:

  • 将站长的我的信息经过hash函数生成一个hash值。
  • 而后用CA机构的私钥对hash值进行加密。
  • 将加密后的内容与站长的我的信息还有网站的公钥一块儿打包成一个公钥数字证书。

验签:

  • 当浏览器拿到这个公钥数字证书以后,就把该证书内容分解出两部分:站长我的信息与加密的hash值。
  • 浏览器将站长的我的信息经过证书说明的hash函数生成一个hash值。
  • 而后用CA机构的公钥解密证书中的加密的hash值。
  • 对比两个hash值是否相等。

证书类型:

  • 域名验证证书domain validatedDV证书
    DV证书一般是免费的
  • 组织验证证书organization validatedOV证书
    OV证书验证更为严格,一般是收费的
  • 扩展验证证书extended validateEV证书
    EV证书最为严格,因此也是最贵的。

从加密安全性上看,三类证书的保密性都是同样的,只有在站长的我的信息验证上有所不一样。

DH密钥交换协议

上面说到张三有两种办法能够拿到李四的公钥:

  • 第一种:经过PKI公钥基础设施拿到的。
  • 第二种:创建连接过程当中经过握手过程由李四传给张三的。

RSA算法通常是第一种方法中用于CA机构的身份验证上的。事实上RSA算法用于第二种方法也是可行的。

举例:
张三与李四创建连接。李四用RSA算法生成一对公私钥,在握手中李四将公钥传递给张三。而后张三将对称加密的密钥用公钥进行加密后传递给李四,李四用私钥解密获得密钥。

就算第三方拿到公钥,没有私钥是没法解密密文的。

但这种方式有一个缺点:没有前向保密性。
也就是说当第三方将通信的报文所有保存下来后,在破解出私钥以后,就能知道全部密文内容。

DH密钥交换协议就解决了这个问题。它能够双方在彻底没有对方任何预先信息的条件下经过不安全信道建立起一个密钥。因此每一次通信中密钥都是实时生成的

具体流程:

  • 首先在握手过程当中,李四生成一对公私钥,将公钥发送给张三。
  • 张三收到李四的公钥后,本身也生成一对公私钥,将本身的公钥发送给李四。
  • 而后张三和李四用DH协议将对方的公钥和本身的私钥生成一个密钥。这两个密钥是彻底相同的。

DH密钥交互协议的原理:

  • 李四指定两个随机公开数gp,而后指定本身私钥a,根据gp和私钥a生成公钥A
  • 李四将公开数gp与本身公钥A发送给张三。
  • 张三本身指定一个私钥b,而后基于公开数gp和私钥b生成公钥B
  • 张三将本身公钥B发送给李四。
  • 张三和李四根据对方的公钥和本身的私钥,生成对称加密用的密钥K

如图所示

DH交换协议的问题:容易遭到中间人伪造攻击。

简单来讲:第三方伪装本身是张三向李四进行一次DH密钥交换,而后又伪装李四向张三进行一个DH密钥交换。就能够知道密钥K

解决这个方法很简单,就是使用PKI公钥基础体系中的身份验证。第三方就没法伪装李四这个站长了。

从图中看出DH协议也涉及到大量的大数乘法运算,速度也是很是慢的。而目前使用的DH密钥交换协议是基于ECC椭圆曲线加持过的,速度很是的快。称为ECDHE密钥交换算法。具体细节能够本身去搜索查询。

总结

TLS1.2中常用的一个安全套件是:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

具体说明一下:

  • ECDHE:密钥交换算法
  • RSA:身份验证算法
  • AES:对称加密的算法
  • 128:对称加密的密钥长度
  • GCM:对称加密的工做模式
  • SHA256:hash算法

参考文献:

分组密码工做模式--wiki
高级加密标准--wiki
RSA算法--wiki
DH密钥交换协议--wiki
《计算机网络:自顶向下方法》
Web协议详解与抓包实战--陶辉

结尾

更多文章请移步楼主github,若是喜欢请点一下star,对做者也是一种鼓励。

相关文章
相关标签/搜索