什么是https?
https就是在http的基础上加了一个TLS层 ,http把数据发给tls,tls经过加密后再下发给tcp。
接收端tcp先把消息tls, tls解密后再返回给http
tls是怎么加密的?
在双方建立连接的过程中, 客户端与服务器先用非对称加密的方式协商出一套密钥, 然后使用这个密钥以对称加密的方式加密通信
什么是对称加密?
对称加密就是通信双方使用同一个密钥,不同的算法进行加密、解密
经典算法: DES(56 位密钥,密钥太短⽽逐渐被弃⽤)、AES(128 位、192 位、256 位密钥, 现在最流⾏)
对称加密的致命缺点就是: 通信双方必须事先知道这个密钥,但现实网络中危险无处不在, 如何安全地传输密钥呢
非对称加密
非对称加密就是通信双方使用同一套算法, 用公钥来加密得到密文, 用私钥解密得到原数据
在这种模型中, 客户端和服务器都有一套自己的公钥/私钥, 通信开始时, 双方交换公钥,
客户端给服务器发数据时用服务器的公钥进行加密, 服务器收到后用自己的私钥解密
同理, 服务器给客户端发数据时, 用客户端的公钥加密, 客户端收到后再用自己的私钥解密。
因为公钥加密后的数据,只有自己的那把私钥才能解开。 换言之, 客户端用服务器公钥加密后的数据, 客户端自己都无法解开,自然也就防止了数据泄露。
可是网络中坏人无处不在, 我们知道通信开始时,客户端和服务器会交换公钥, 如果这个时候公钥被人窃取, 那么他虽然不能用公钥解密通信双方发出去的数据, 但是却可以伪造数据,伪装成客户端、服务器
为了防止这种攻击, 数字签名诞生了
现在,通信双方发送数据时, 先对原数据进行一次hash算法, 然后对hash值签名(用自己的私钥加密),将签名附加到原数据后面一起发送给对方。 对方收到数据后, 用公钥解密得到hash值, 然后对收到的数据以相同的方式进行hash算法, 如果得到的hash值相同,就说明信息没有被篡改。
这里涉及到几个知识点:
1, 非对称加密中, 同一对密钥, 公钥加密的数据私钥可以解密, 私钥加密的数据公钥也可以解密
2, 为什么不直接对原数据用私钥加密后传输呢? 因为直接这样操作的话会让签名比原数据还要大, 浪费系统资源
3, hash: 目前常用的hash算法有MD5, SHA1, SHA256等, hash不是加密, hash算法是不可逆的
现在再回到Https的问题,
既然非对称加密+数字签名已经解决了通信安全的问题, 为什么Https还要用对称加密来进行通信呢?
因为非对称加密算法复杂, 如果通信过程中全程使用非对称加密, 将会非常影响网络性能
https建立通信的一般过程:
1, 客户端 发送client hello, header中会包含 可供服务端选择的TLS版本, 可供服务端选择的加密套件, 以及一个客户端随机数
2, 服务器端收到后, 发送server hello, header中包含服务器端选择的tls版本,加密套件,以及一个服务器随机数
3, 服务器端发送服务器证书给客户端, 一并发送的有: 服务器公钥,服务器主机名, 证书的签名,证书签发机构的公钥/签名等。
4, 客户端收到公钥后, 对公钥进行验证(一方面是合法性验证, 就是看你这个证书是不是合法机构颁发的, 另一方面是看这个服务器主机名是不是自己想要通信的主机名)
验证通过后, 客户端生成另一个随机数Pre-master secret, 用服务器公钥加密后发给服务器
接下来客户端和服务器就可以根据 客户端随机数+服务器随机数+Pre-master secret 来生成master secret
(为什么需要这个Pre-master secret呢? 因为之前的客户端随机数和服务器随机数不是加密传输的, 可能被窃取)
这个master secret包含客户端加密密钥, 服务端加密密钥, 客户端MAC secret, 服务器端MAC secret
(我们之前说对称加密中, 双方使用的是同一个密钥, 那为什么这里要用两个密钥呢? 是为了防止一种攻击, 比如其他人拿到消息之后,把消息给你扔回来, 这时候如果用的是同一个密钥, 你可能就会以为这是服务器发回来的消息)
MAC secret 带密码的hash算法, 用来验证身份, 而且它不能被公众验证身份。
5, 客户端通知服务器, 自己将使用加密通信
6, finish (把1-5的信息加在一起发出去, ,不包含密钥)
(4,5,6步在这里是一条请求)
7, 服务器端将使用加密通信
8, 服务器finish(1-7的信息加在一起发出去,不包含密钥)