HTTPS中的密码学知识

一 HTTPS 存在意义

HTTP 协议有些安全问题,HTTPS 为解决这些安全问题造成的,主要有哪些安全问题:

  • 机密性
    http 中传输中的内容是明文形式,不具备机密性,网络中如果有流量嗅探器,发送的数据都可以捕获,这样用户名和密码容易泄漏.

  • 完整性
    所谓的完整性,就是收到的数据就是发送方数据,假如数据被篡改,如果有策略知道数据被篡改,那传递的数据就具有完整性. HTTPS 中采用消息验证码(MAC)算法来保证数据完整性.

  • 身份验证
    http 交互中,客户端和服务器端不能验证双方的身份,容易造成中间人攻击等. HTTPS 中采用数据证书的方式进行身份验证.

  • 不可抵赖
    用非对称加密算法中私钥签名,对方用公钥解密,因为私钥和公钥是配对的,所以通过这种签名验证的方式,防止抵赖。

这四点是 HTTP 协议的安全方面的主要问题,HTTPS 的出现也就是主要为了解决这几个问题的.

二 Hash 算法

我们在数据结构中常用的 Hash 表,通过 Hash 算法将 key 映射到数组的一个槽位中,密码学中也用 Hash 算法:摘要/散列值 = hash(消息)密码学中的 hash 算法有以下特性:

  1. 相同的消息通过 hash 算法后,最终的摘要值的长度是相同的,值也是相同的。这个和普通 Hash 算法没多少区别。

  2. Hash 要求性能高,无论多长的消息都可以快速计算出摘要值。

  3. 通过 Hash 值很难计算出消息值,唯一办法是通过暴力破解,字典攻击,彩虹表的方法进行破解。

  4. 原始消息一旦有轻微的改变,摘要值就会发生很大的变化。

  5. 很难找出两个不同的消息,摘要值,但是一定有两个不同的消息映射成相同的值,这种叫 Hash 冲突或碰撞。

密码学中的 hash 算法要求:

  • 强抗碰撞性
    两个不同的值能够得到同样的摘要值,这叫 hash 碰撞,密码学中 Hash 算法必须具有强抗碰撞性。

  • 弱抗碰撞性
    给一个消息和一个消息的摘要,很难找到一条不同的消息,也有相同的摘要。

  • 单向性
    给一个摘要值,很难计算出原始消息,这就是单向性。

常用的 hash 算法有: 

1)MD5
MD5 是比较常见的算法,摘要长度为 128 比特,目前以及不安全了,违反了强抗碰撞性攻击。通过 2^80 次数次计算就可以破坏强抗碰撞性(即通过这么多次计算得出两个不同的消息,会得到不同的消息,得到相同的 hash 值)。 

2) SHA 算法
SHA-I 类似 MD5 算法,输出的长度固定为 160 个比特。也会产生碰撞,但是比 MD5 好些。SHA2 算法目前是安全的,输出比特分别为 256 比特,512 比特,384 比特等。

三 对称加密算法

HTTPS 主要利用对称加密算法来加解密数据,来保障数据的私密性。密钥是一串数字。

常见的对称的加密算法,有块加密算法:

  • AES 算法

  • DES 算法

  • 3DES 算法 流加密算法:

  • RC4(目前已经证明不安全)

  • ChaCha

对称加密算法的运算也不是一次性就运算完的,块密码算法有多种迭代模式。

3.1 ECB 模式

最简单的模式,将数据分成若干块,每块分别加密,最后拼在一起就是密文。解密过程倒过来即可,如下图:

ECB模式解密过程

特点:

  • 明文最后长度如果小于分组块大小,需要填充。

  • 分组之间没有关系,可以并行计算,性能好。

  • 密文的长度和明文长度一样,且固定的明文和密钥计算出来的数值是一样的,存在安全隐患,有可能在传输过程中被篡改。

3.2 CBC 模式

此模式解决了 ECB 的模式的安全问题。

  • 数据仍然像 ECB 模式一样进行分组,最后一组数据小于分组数据的需要填充。

  • 随机的初始化向量 IV 和第一个数据块进行 XOR 操作,再用密钥进行加密,由于引入了随机的初始化向量,可以保证相同的数据,相同的密钥每次的加密结果是不同的。

  • 后面的 n 块数据会和 n-1 块数据的加密结果进行 XOR 操作,然后再用密钥进行加密。
    最后组合起来就是密文。

CBC迭代模式解密过程
  • 将加密数据按照分组长度拆成 N 多个加密块。

  • 对第一个密文块进行解密,然后和接收到的明文 IV 进行 XOR 操作,结果作为第一个明文。

  • 将第二个密文块解密,然后和第一个密文进行 XOR 操作 得到第二个明文块。

  • 依次类推组合起来得到所有的明文。

说明:

  • 初始化向量 IV 的长度= 数据分组长度,为随机的。

  • 一般情况下,初始化向量 IV 不加密的和密文一起传输。

  • 不能并行处理,因为每个数据块都依赖上一个数据块的结果。

3.3 CTR 模式

CRT 模式(counter)相当于流密码的运行模式。每次迭代运算都要生成一个密钥流、生成密钥流的方法是任意的,但是各个密钥流之间是有关系的,最简单的方法是密钥流不断递增,所以叫计数器模式。

CRT加密模式
  • 明文拆成数据块,不需要进行填充。

  • 迭代处理之前先生成密钥流,有多少个数据块就有多少个密钥流,密钥流可以通过递增方式生成。

  • 第一个密钥流获取方式也简单就是生成一个随机值(Nonce),此值等同 IV。

  • 用密钥流加密 Nonce,结果在和数据块进行 XOR 操作,最后得到密文分组,最后拼接。

解密过程
  • 将密文拆成多个数据块,不需要填充。

  • Nonce 是加密者将此值发送给解密者的,不加密。

  • 通过密钥对 Nonce 流加密,注意这里面仍然是加密,然后在和密文 XOR 操作得到明文块。

图有问题,CBC 是无法进行并行加密的。

3.4 填充模式

刚才所有的算法,都需要对原文进行按照特定长度进行分块,如果不是分块长度的整数倍,那么最后一个数据块进行填充。

有两种常见填充方式:PKCS#5 和 PKCS#7 PKCS#5 填充举例如下:

01
02 02
03 03 03
04 04 04 04

完成解密后,得到最后一个字节的值 n,去掉最后 n 个字节得到原始报文。PKCS#7 和 PKCS#5 原理是一样的,只是 PKCS#7 支持的的分组长度为 1 到 255 个任意字节,PKCS#5 只支持 8 个字节。

四 消息验证码

4.1 数据完整性保证 HASH 算法

对信息进行 hash 算法运算,运算结果就是 hash 码,hash 算法计算速度非常快,而且对数据非常敏感,信息一点有一点变动,hash 的结果是不同的。
有没有可能不同的信息产生相同的 hash 码那,有可能,这就叫 hash 碰撞,不过密码学里面用的 hash 是至少是强抗碰撞的,也就是很难找到两个不同的信息其 hash 结果是相同的。

数据完整是不是就代表数据没有被篡改那,不是,因为还有可能是信息整体包括 hash 的计算值都被替换了,那如何验证数据是否被篡改那。

4.2 数据防篡改和验证保证 HMAC

MAC 是 Message Authentication Code 即消息验证码,这个类比是古代的盖章的蜜蜡。
MAC 两个作用:
1) 保证消息的完整性,防止消息被篡改。

2) 验证消息来源的真实性。
在 HASH 算法下,第三方可以修改消息,但是在 MAC 中,由于第三方不知道密钥,所以无法修改消息,也就防止了消息的被篡改,像古代蜜蜡很容易重新点上,但是上面的印章却无法伪造,这就保证了消息的准确性。

MAC(值) = MAC(信息、密钥)

这个前提是,通信双方拥有共同的密钥,才可以进行通信,MAC 值一般和消息一起传递,消息可以选择加密也可以选择不加密。

4.3 MAC 算法种类

MAC 算法有两种形式,是 CBC-MAC 算法和 HMAC 算法。

HMAC(Hash-based Message Authentication Code)算法使用 Hash 算法作为加密基本元素,HMAC 并不是简单的 Hash 算法加上密钥,内部很复杂。
MAC 算法包括 CBC-MAC、HMAC。
HMAC 是 Hase Base MAC 基于 Hash 算法的 MAC。
HMAC-SHA-1 、HMAC-SHA-256、HMAC-SHA-512

4.4 AD 加密模式

HTTPS 使用的时候,对称加密算法和 HMAC 算法是一起使用的,提供加密和完整性的模式叫 Authenticated Encryption(AE)加密模式。主要有三种:

  1. Encrypt-and-MAC (E&M)
    从名称来看,是先对消息加密后进行 MAC 运行,然后结合起来:

  2. MAC-then-Encrypt (MtE)
    这种模式先对消息进行 MAC 计算,然后将消息和 MAC 值组合在一起加密。HTTPS 中一般采用这种模式进行处理。

  3. Encrypt-then-MAC(EtM)
    先对消息进行加密得到密文,然后对密文再计算 MAC 值,最终将密文和 MAC 结合起来。

这三种模式,只有 MAC-then-Encrypt 是对 MAC 也加密的,一般建议用这种方式。

4.4 AEAD 模式

AEAD 模式是 AE 模式的变形,因为 AD 加密和 MAC 分开的,容易造成一些问题。AEAD 模式底层组合了加密算法和 MAC 算法,能够同时保证数据机密性和完整性。

  1. CCM 模式
    使用 CBC-MAC 算法,其实底层采用 MAC-then-Encrypt 模式。

  2. GCM 模式

    这种模式我在解析 https 的时候遇到过,在 GCM 内部,采用 GHASH 算法进行 MAC 计算,使用块密码 AES 算法 CTR 模式的一种变种进行加密运算。

五 公开密钥算法

公开密钥算法即非对称加密算法,在 HTTPS 协议中非常重要,主要有三个特点:

  1. 可以支持加解密,数字签名,和密钥协商。通过数字签名来认证服务器或客户端是我们要连的,防止中间人攻击。通过密钥协商来协商对称加密的密钥。

  2. 密钥是一对 和对称加密算法的一个密钥不同,公开密钥算法密钥是一对,包括公钥和私钥。公钥公开,私钥保密。公钥加密私钥解密,私钥签名公钥验证。

  3. 公开加密算法运行速度慢 HTTPS 中,由于公开加密算法比较慢,所以只用公开密钥算法做密钥协商和数字签名使用。

常用的公开密钥算法有:RSA 算法, DH 算法,ECDH 算法。

RSA 算法进行密钥协商如下:

其实这里面的密钥协商和 HTTPS 用的 RSA 的还是有差异,HTTPS 中密钥是通过计算的,客户端发送的是 premasterkey,结合服务器和客户端的随机数来计算得到 master key。

优点

  1. 每次会话的密钥都不同,不需保存,连接短了后密钥消失。

  2. RSA 运算慢,但是对称密钥可以很短,所以计算量不大。缺点:

  3. 会话密钥完全由客户端决定(其实 HTTPS 时候并不是这样子),如果密钥短,攻击者可能会暴力破解密钥。

  4. 不能提供前向安全,即抓到的数据包,如果密钥被泄漏后,可以将以前的数据包解密出来。

DH 密钥协商算法

这里面 a 和 b 比较重要,但是并没有在流量中存在,流量抓到 Yc 和 Ys 仍然无法破解密钥。 

不过对于静态 DH 算法,如果服务器的公钥 Ys 泄漏,仍然不能提供前向安全。对于动态 DH 算法,EDH 算法,每次连接的时候都会重新生成 DH 密钥对,DH 密钥对仅仅保存在内存中,攻击者即时从内存中破解到私钥也只影响到本次通信,因为每次密钥对都是动态变化的。更安全的是,协商出会话密钥,a 和 b 的私钥可以丢弃,在有限的空间和时间内生成密钥对。

还有比较重要的是 ECDH 算法,即 ECC 算法集合 DH 算法,此算法也可以提供前向安全。

六 数字签名

数字签名和现实中的签名类似,都是为了个人身份的确认和防止抵赖。

数字签名有以下特点:

  1. 防篡改 数据不会被修改。

  2. 防止抵赖 只要用公钥认证了这个签名,一定就是这个公钥对应的私钥者签名的,无法抵赖。

  3. 防止伪造 发送算法不能伪造。

签名过程

签名验证

签名过程

  1. 发送者对发送的消息计算摘要值。

  2. 发送者用私钥对摘要值进行签名。

  3. 发送者将原始消息和签名值一起发送。

验证过程

1. 接受者收到消息后,拆分出消息和签名值。

2. 运用同样的 hash 算法在消息上,得到摘要值 A。

3. 接受者在签名值上用公钥运算得到摘要值 B。

4. 比较两个值是否一致,如果一致就验证通过。 

常用的签名算法:RSA/DSA/ECDSA

                                             大量参考《深入浅出HTTPS从原理到实践》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值