HTTPS学习

HTTPS学习笔记

Posted by Jae on April 19, 2019

1. HTTP

HTTP是构建于TCP/IP协议之上的应用层协议,HTTP协议是无状态的,传输层通过TCP协议进行可靠传输,网络层依靠 IP协议进行路由寻址。 HTTP协议

客户端向服务器发送请求,服务器对其进行响应,整个过程中没有对数据进行加密,全部以明文方式传输,如果我们使用抓包工具 对HTTP协议的数据包进行抓取就能从中获取到传输的信息,如果中间人对数据进行截获并篡改了数据就会带来信息的泄露。

2. 对称加密

对于HTTP中使用明文传输,那么我们能不能对每次传输的数据进行加密呢?如果对数据进行加密后传输就能防止数据的泄露。 比较高效的一种加密方式就是 对称加密,所谓对称加密就是客户端和服务端使用相同的密钥对数据进行加密和解密。

对称加密

我们使用对称密钥对传输的数据进行加密和解密,这样就解决了数据明文传输不安全的问题,但是现在只有一个客户端,如果有成千上万个客户端呢?

3. 密钥安全

如果成千上万个客户端和服务端传输数据均使用同一个密钥进行加密解密,其中一个客户端的密钥泄露那就会导致所有的客户端的数据都遭到威胁。 密钥安全

那么我们对于上面的问题一个比较简单的解决办法就是为每一个客户端都使用不同的对称密钥,这样其中任何一个客户端的密钥泄露都不会危机其它客户端。 但是这成千上万个客户端加密使用的密钥怎么进行分发和管理?

4. 密钥分发

每个客户端和服务器传输数据之前先去服务器请求此次传输数据的加密密钥,然后服务器为客户端生成密钥,并通过http传输给客户端。但是 密钥如果使用HTTP传输,那密钥被中间人截获了怎么办?这样中间人就可以使用整个密钥为所欲为了,那怎么保证双方使用的密钥在传输过程中不被攻击?

密钥分发

5. 非对称加密

使用对称加密虽然效率高,但是在对称密钥分发过程中不能保证密钥的安全,于是我们想到使用非对称加密,非对称加密是生成一对密钥对,分别叫做公钥和私钥,公钥 可以公开,但是私钥不能泄露,在传输过程中,对明文使用公钥加密,接收方使用对应的私钥对密文进行解密,同样接收方使用私钥对明文进行加密后发送给发送方,发送方使用 对应的公钥对密文进行解密。

非对称加密

在传输公钥的过程中,可能造成公钥的泄露,但是可以肯定的是私钥能保证不被泄露,这样即使中间人拿到密文也无法解密数据,因为私钥是保存在服务器端的。 但是还存在一个问题就是如果中间人截获了公钥并修改了公钥:

中间人攻击 这时候客户端拿到的公钥是被攻击者篡改的假公钥,这样也会造成数据的泄露,那有没有方法验证客户端拿到的公钥没有被攻击者篡改呢?

6. 可信第三方

上面的公钥被攻击者篡改了,但是客户端并不知道,那如何验证公钥的是否是可信的呢?在HTTPS中使用证书+数字签名的方式来保证公钥的合法性。那什么是证书和签名呢? 证书就是第三方权威认证机构CA给我们签署的,我们提供网站的信息和公钥以及加密方式给第三方可信机构,三方机构通过我们提供的加密方式比如SHA256对我们的网站信息以及公钥进行加密,再密文的基础上再使用机构自己的私钥对密文进行二次加密,这样就生成了数字签名,网站的信息加上数字签名就是数字证书了。 数字证书

7. 数字证书

如果中间人对证书中的公钥进行了篡改客户端怎么来识别? 篡改证书

8. 签名

那为什么我们的数字证书需要第三方机构的签名呢?签名的作用主要是验证网站信息中的公钥有没有被攻击者篡改过, 如果没有数字签名,攻击者也去CA申请自己的证书,并将客户端申请的证书中的网站信息修改成自己的,客户端使用第三方机构的公钥对证书进行解密后 拿到的是攻击者网站的信息,然后使用攻击者的公钥加密数据并发送给了中间人,中间人使用自己的私钥对数据解密。

9. 加密传输

在安全拿到了服务器的公钥后,客户端会随机生成一个对称密钥,并使用服务器的公钥加密,传输给服务器,服务器和客户端就使用整个对称密钥进行数据的加密和传输。


< script src = " / js / bootstrap.min.js " >