一 HTTPS 存在意义
HTTP协议有些安全问题,HTTPS为解决这些安全问题造成的,主要有哪些安全问题那:
- 机密性
http中传输中的内容是明文形式,不具备机密性,网络中如果有流量嗅探器,发送的数据都可以捕获,这样用户名和密码容易泄漏. - 完整性
所谓的完整性,就是收到的数据就是发送方数据,假如数据被篡改,如果有策略知道数据被篡改,那传递的数据就具有完整性.
HTTPS中采用消息验证码(MAC)算法来保证数据完整性. - 身份验证
http交互中,客户端和服务器端不能验证双方的身份,容易造成中间人攻击等.
HTTPS中采用数据证书的方式进行身份验证. - 不可抵赖
用非对称加密算法中私钥签名,对方用公钥解密,因为私钥和公钥是配对的,所以通过这种签名验证的方式,防止抵赖。
这四点是HTTP协议的安全方面的主要问题,HTTPS的出现也就是主要为了解决这几个问题的.
二 Hash算法
我们在数据结构中常用的Hash表,通过Hash算法将key映射到数组的一个槽位中,密码学中也用Hash算法:
摘要/散列值 = hash(消息)
密码学中的hash算法有以下特性:
- 相同的消息通过hash算法后,最终的摘要值的长度是相同的,值也是相同的。这个和普通Hash算法没多少区别。
- Hash要求性能高,无论多长的消息都可以快速计算出摘要值。
- 通过Hash值很难计算出消息值,唯一办法是通过暴力破解,字典攻击,彩虹表的方法进行破解。
- 原始消息一旦有轻微的改变,摘要值就会发生很大的变化。
- 很难找出两个不同的消息,摘要值,但是一定有两个不同的消息映射成相同的值,这种叫Hash冲突或碰撞。
密码学中的hash算法要求:
- 强抗碰撞性
两个不同的值能够得到同样的摘要值,这叫hash碰撞,密码学中Hash算法必须具有强抗碰撞性。 - 弱抗碰撞性
给一个消息和一个消息的摘要,很难找到一条不同的消息,也有相同的摘要。 - 单项性
给一个摘要值,很难计算出原始消息,这就是单项性。
常用的hash算法有:
1)MD5
MD5 是比较常见的算法,摘要长度为128比特,目前以及不安全了,违反了强抗碰撞性攻击。通过2^80次数次计算就可以破坏强抗碰撞性(即通过这么多次计算得出两个不同的消息,会得到不同的消息,得到相同的hash值)。
2) SHA算法
SHA-I类似MD5算法,输出的长度固定为160个比特。也会产生碰撞,但是比MD5好些。
2)SHA-2算法
SHA2算法目前是安全的,输出比特分别为256比特,512比特,384比特等。
三 对称加密算法
HTTPS主要利用对称加密算法来加解密数据,来保障数据的私密性。密钥是一串数字。
常见的对称的加密算法,有块加密算法:
- AES算法
- DES算法
- 3DES算法
流加密算法: - RC4(目前已经证明不安全)
- ChaCha
对称加密算法的运算也不是一次性就运算完的,块密码算法有多种迭代模式。
3.1 ECB模式
最简单的模式,将数据分成若干块,每块分别加密,最后拼在一起就是密文。
解密过程倒过来即可,如下图:
特点:
- 明文最后长度如果小于分组块大小,需要填充。
- 分组之间没有关系,可以并行计算,性能好。
- 密文的长度和明文长度一样,且固定的明文和密钥计算出来的数值是一样的,存在安全隐患,有可能在传输过程中被篡改。
3.2 CBC 模式
此模式解决了ECB的模式的安全问题。
- 数据仍然像ECB模式一样进行分组,最后一组数据小于分组数据的需要填充。
- 随机的初始化向量IV和第一个数据块进行XOR操作,再用密钥进行加密,由于引入了随机的初始化向量,可以保证相同的数据,相同的密钥每次的加密结果是不同的。
- 后面的n块数据会和n-1块数据的加密结果进行XOR操作,然后在用密钥进行加密。
最后组合起来就是密文。
- 将加密数据按照分组长度拆成N多个加密块。
- 对第一个密文块进行解密,然后和接收到的明文IV进行XOR操作,结果作为第一个明文。
- 将第二个密文块解密,然后和第一个密文进行XOR操作 得到第二个明文块。
- 依次类推组合起来得到所有的明文。
说明:
- 初始化向量IV的长度= 数据分组长度,为随机的。
- 一般情况下,初始化向量IV不加密的和密文一起传输。
- 不能并行处理,因为每个数据块都依赖上一个数据块的结果。
3.3 CTR模式
CRT模式(counter)相当于流密码的运行模式。每次迭代运算都要生成一个密钥流、生成密钥流的方法是任意的,但是各个密钥流之间是有关系的,最简单的方法是密钥流不断递增,所以叫计数器模式。
- 明文拆成数据块,不需要进行填充。
- 迭代处理之前先生成密钥流,有多少个数据块就有多少个密钥流,密钥流可以通过递增方式生成。
- 第一个密钥流获取方式也简单就是生成一个随机值(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)加密模式。
主要有三种:
-
Encrypt-and-MAC (E&M)
从名称来看,是先对消息加密后进行MAC运行,然后结合起来:
-
MAC-then-Encrypt (MtE)
这种模式先对消息进行MAC计算,然后将消息和MAC值组合在一起加密。HTTPS中一般采用这种模式进行处理。
-
Encrypt-then-MAC(EtM)
先对消息进行加密得到密文,然后对密文再计算MAC值,最终将密文和MAC结合起来。
这三种模式,只有MAC-then-Encrypt 是对MAC也加密的,一般建议用这种方式。
4.4 AEAD模式
AEAD模式是AE模式的变形,因为AD加密和MAC分开的,容易造成一些问题。AEAD模式底层组合了加密算法和MAC算法,能够同时保证数据机密性和完整性。
- CCM模式
使用CBC-MAC算法,其实底层采用MAC-then-Encrypt模式。
2.GCM模式
这种模式我在解析https的时候遇到过,在GCM内部,采用GHASH算法进行MAC计算,使用块密码AES算法CTR模式的一种变种进行加密运算。
五 公开密钥算法
公开密钥算法即非对称加密算法,在HTTPS协议中非常重要,主要有三个特点:
可以支持加解密,数字签名,和密钥协商。
通过数字签名来认证服务器或客户端是我们要连的,防止中间人攻击。
通过密钥协商来协商对称加密的密钥。密钥是一对
和对称加密算法的一个密钥不同,公开密钥算法密钥是一对,包括公钥和私钥。公钥公开,私钥保密。公钥加密私钥解密,私钥签名公钥验证。公开加密算法运行速度慢
HTTPS中,由于公开加密算法比较慢,所以只用公开密钥算法做密钥协商和数字签名使用。
常用的公开密钥算法有:
RSA算法, DH算法,ECDH算法。
RSA算法进行密钥协商
如下:
其实这里面的密钥协商和HTTPS用的RSA的还是有差异,HTTPS中密钥是通过计算的,客户端发送的是premasterkey,结合服务器和客户端的随机数来计算得到master key。
优点:
- 每次会话的密钥都不同,不需保存,连接短了后密钥消失。
- RSA运算慢,但是对称密钥可以很短,所以计算量不大。
缺点: - 会话密钥完全由客户端决定(其实HTTPS时候并不是这样子),如果密钥短,攻击者可能会暴力破解密钥。
- 不能提供前向安全,即抓到的数据包,如果密钥被泄漏后,可以将以前的数据包解密出来。
DH密钥协商算法
这里面a和b比较重要,但是并没有在流量中存在,流量抓到Yc和Ys仍然无法破解密钥。
不过对于静态DH算法,如果服务器的公钥Ys泄漏,仍然不能提供前向安全。
对于动态DH算法,EDH算法,每次连接的时候都会重新生成DH密钥对,DH密钥对仅仅保存在内存中,攻击者即时从内存中破解到私钥也只影响到本次通信,因为每次密钥对都是动态变化的。更安全的是,协商出会话密钥,a和b的私钥可以丢弃,在有限的空间和时间内生成密钥对。
还有比较重要的是ECDH算法,即ECC算法集合DH算法,此算法也可以提供前向安全。
六 数字签名
数字签名和现实中的签名类似,都是为了个人身份的确认和防止抵赖。
数字签名有以下特点:
- 防篡改
数据不会被修改。 - 防止抵赖
只要用公钥认证了这个签名,一定就是这个公钥对应得私钥者签名的,无法抵赖。 - 防止伪造
发送算法不能伪造。
签名过程:
- 发送者对发送的消息计算摘要值。
- 发送者用私钥对摘要值进行签名。
- 发送者将原始消息和签名值一起发送。
验证过程:
1.接受者收到消息后,拆分出消息和签名值。
2.运用同样的hash算法在消息上,得到摘要值A。
- 接受者在签名值上用公钥运算得到摘要值B。
- 比较两个值是否一致,如果一致就验证通过。
常用的签名算法:RSA/DSA/ECDSA