Okhttp使用过程中的TLS握手验证与HostName验证问题accept-encoding问题

Okhttp使用过程中的TLS握手验证与HostName验证问题accept-encoding问题,第1张

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

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

TLS/SSL 协议主要包含两部分:

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

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

因为使用了相同的莫斯密码,所以这属于对称加密。

网络通讯中的对称加密之所以能够使用相同的密钥对内容进行加/解密,是因为使用了异或运算。

在数学领域中异或运算:当两两数值相同为否,而数值不同时为真。
举例:
现有一把密钥:1010,与明文:0110。

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

优点:

缺点:

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

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

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

但并不是所有的明文都能恰好的划分为16字节的块。这时就需要填充!

填充的目的:

填充主要有两种方法:

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

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

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

1、 电子密码本 ECB 模式-- Electronic codebook
就是直接将明文分解为多个块,对每个块进行加密。
这种工作方法非常简单、快速。但是缺点在于同样的明文块会被加密成相同的密文块;因此,它不能很好的隐藏数据模式。

举例:
对进行 ECB 之后,是无法隐藏到图像的轮廓特性的。如下图所示:
CTR 模式同样存在问题:无法提供密文的完整性校验。当密文在传输过程中存在丢失的情况下,是无法保证密文的完整性的。

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

hash 函数是一种从任何一种数据中创建小的数字“指纹”的方法。 hash 函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。
简而言之就是:无论输入多长的字符串,通过 hash 函数,都能得到定长较短的字符串。
MAC 工作流程如图所示:
CTR 分组工作模式加上 MAC 算法就诞生了 GCM 分组工作模式。

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

AES 的分组 Block 块长度固定为128比特,也就是16字节。
密钥长度则可以是128,192或256比特。
所以从上图中看出,分组长度128比特分为4个32比特。而不同长度的密钥则分为4、6 8组32位比特的矩阵。

AES 加密流程:如图所示
10轮加密可分为初始轮、普通轮和最终轮。

addRoundKey 轮密钥加

SubBytes 字节替代

ShiftRows 行移位
对称加密的最大的问题是怎么把密钥传递给对方。非对称密码可以实现密钥的安全传递。

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

非对称加解密过程:

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

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

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

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

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

RSA 算法中公私钥的产生:

RSA 的安全性依赖于大数因数分解非常非常困难,也就是通过一个大数 n 是非常难的分解出 p 和 q 。

RSA 算法的加解密流程:如下图所示
由于进行大量的大数乘法运算,RSA的速度是对应同样安全级别的对称密码算法的1/1000左右。

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

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

签名与验签的流程
签名:

验签:

证书类型:

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

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

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

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

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

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

而 DH 密钥交换协议就解决了这个问题。它可以双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。所以每一次通讯中密钥都是实时生成的

具体流程:

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

简单来说:第三方假装自己是张三向李四进行一次 DH 密钥交换,然后又假装李四向张三进行一个 DH 密钥交换。就可以知道密钥 K 。

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

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

TLS12 中经常使用的一个安全套件是:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

具体说明一下:

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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/12989018.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存