老规矩,https是什么?
网络之所以要分层主要是因为网络的不确定性
http是明文传输,通信不安全
https 在网络分层模型中并不是一个单独的分层
https只是在http与tcp之间添加了一个TLS或者SSL的中间件用于保证通信安全
Https的安全保证基于 对称加密,非对称加密以及验证验证与签名。
对称加密
通信双方拥有相同的密钥。发送方用密钥加密,接收方用相同的密钥解密 称之为 对称加密
1 | 优点:算法公开、计算量小、加密速度快、加密效率高 |
相关的算法 :
1 | AES : 密钥的长度可以为128、192、256位,也就是16个字节、24个字节、32个字节 |
非对称加密
通信双方均拥有各自的公钥与私钥,发送方使用 接收方的公钥 加密,接收方接收到数据后用自己的私钥解密。接收方使用发送方的公钥加密,发送方使用自己的私钥解密,称之为非对称加密。
简称 公钥加密,私钥解密
优点: 公钥传输方便安全
缺点:算法复杂,加密速度慢
相关的算法:RSA DSA(比特币使用该算法,只用于数字签名) ,ECC(椭圆曲线算法)
验证与签名
验证的目的是为了证明 信息的发送方,签名的目的是为了 验证发送的信息是否被篡改
用私钥加密,用公钥解密称之为 验证。
信息通过一定的hash算法生成摘要,然后用私钥加密 生成签名,然后将签名与hash算法附加在信息之后一起发送,接收方接收到数据之后用hash算法对信息进行hash,然后用发送方的公钥解密,对量两个的hash值。如果用公钥能解密,则说明信息来自与发送方,如果hash值一致则表示消息没有被篡改

数字证书
数字证书包含了由受信任的机构担保的用户或公司的相关信息
数字证书中的内容有:证书的发布者,证书发布者的数字签名,用户或公司的 公钥,用户或公司的主机名
https(TLS/SSL)的连接过程
1.A 向 B发送连接请求,会附加一个加密套件(cipersuite)以及一个随机数 X,其中加密套件中包含了对称加密算法,非对称加密算法,以及hash算法
2.B接收到A的请求后会在cipersuite中选择对应的加密算法与非加密算法以及hash算法回传给B,同时也会附加一个随机数 Y
3.同时B会回传自己的数字证书(用于对方获取自己的公钥)
4.A收到B的回传之后,使用权威机构提供的公钥,验证证书是否为该机构颁发,再验证该证书的主机名是否与自己通信的主机名一致,最后过验证签名机制验证签名是否被更改,由此可以拿到B的公钥。
5.拿到B的公钥之后A会再生成一个随机数 Z
6.使用B的公钥将该随机数加密之后发送给B
7.此时AB双方已经拥有了相同的随机数 X,Y,Z,加密算法,以及hash算法
8.双方按照约定通过 DH 算法生成密钥
9.双方通过加密后的密钥进行通信
DH(Diffie-Hellman)密钥交换算法
DH算法的原理基于离散对数的难题 如下所示:
解释一下
- 通信甲、乙双方分别拥有两个相同的大数 P,G
- 甲生成随机数 a, 通过算法 Ka = Pa mod G 等到数 Ka
- 乙同样生成随机数b,通过算法 Kb = Pb mod G 等到数 Kb
- 甲乙双方通过 非对称算法 将 Ka 与 Kb 传递给对方
- 此时甲拥有的数为 :P,G,a,kb;乙拥有的数为:P,G,b,ka
- 甲通过 Kba mod G = K1 生成密钥K1,乙通过 Kab mod G = K2 生成K2,如果是通信双方,那么此时 K1 = K2
- 就算有黑客获取到了数 P,G,以及Ka,Kb,但是当它们都是非常大的数的时候,依靠这四个数来计算a和b非常困难,这就是离散对数数学难题。
最后我来梳理以下https底层生成密钥的流程
甲向乙发送一个tcp请求(明文) ,明文中附带了一个随机数 P 以及 加密套件(cipersuit),加密套件中包含了对称加密算法,非对称加密算法以及hash算法
乙收到之后选择对应的加密套件(对称加密算法,非对称加密算法以及hash算法),同时返回一个大随机数 G,此时甲乙共同拥有相同的随机数 P、G 以及加密套件。
乙会附带返回自己的数字证书给乙。
甲对乙的数字证书验证通过之后,会随机生成一个随机数 a ,通过 DH 算法生成随机数 Ka,然后通过双方选定的非对称加密算法将 Ka 发送给 乙。(此时已经建立了连接是密文了)
乙收到甲的随机数之后,乙也会生成一个随机数 b,也通过 DH 算法生成随机数 Kb,然后乙也同样会通过非对称加密将Kb发送给甲。
这一步结束之后 甲中拥有了 随机数 P、G、a、Kb,乙拥有了随机数:P、G、b、Ka
甲通过 Kba mod G = K1 生成密钥K1,乙通过 Kab mod G = K2 生成K2 (DH算法)
如果K1 == K2,那么表示通信的是甲乙双方。
甲乙通过密钥 K1 与 K2 互相通信。
最后来张图镇楼