什么是 HTTPS
HTTPS 协议就是在 HTTP 协议基础上,引入了加密层(SSL/TLS协议)。
HTTP 协议是明文传输的,传输的数据是不安全的,数据传输过程中,可能会被第三方获取到,甚至可能会篡改数据。
HTTPS 协议就是解决 HTTP 协议的安全问题,HTTPS 协议在数据传输之前,对数据进行加密,然后再进行传输,这样就算传输过程中,被第三方获取了,数据也是安全的。
对称加密
对称加密就是使用同一个密钥对数据进行加密和解密。
服务器和客户端使用相同的密钥进行加密和解密,服务器要服务很多个客户端,对每个客户端都要使用不同的密钥,但是如何让对方知道密钥呢,密钥进行网络传输,也可能被获取到。
所以对称加密,还不足以解决问题,除非密钥不进行网络传输,在线下约定密钥,但这显然不太现实。
非对称加密
非对称加密有两个密钥,一个公钥,一个私钥,使用公钥加密,私钥解密,或者使用私钥加密,公钥解密。
公钥是公开的,每个人都可以获取到。私钥只有自己使用,不进行网络传输。
客户端: 首先获取服务器的公钥 pub
,然后使用 pub
加密客户端自己生成的对称密钥 key
,将这个加密后的对称密钥 key
,发送给服务器,然后客户端就可以使用 key
对接下来要传输的数据进行加密。
服务器: 拿到加密后的 key
,用自己的私钥 pri
进行解密,接下来就可以用 key
对客户端传输的数据进行解密了。
黑客: 虽然可以获取到传输的数据,但是数据都是加密过的,黑客不知道服务器的私钥 pri
,也就无法获取到明文的 key
,也就无法对客户端的数据进行解密。
为啥不直接用 pub 加密数据,而是用 pub 加密 key,再用 key 加密数据呢?
原因是非对称加密计算开销比较大,为了性能所以搭配对称加密使用。
中间人攻击
- 服务器传输给客户端的公钥
pub
被黑客用自己的公钥pub2
替换了。 - 客户端使用
pub2
对key
进行加密,发送给服务器。 - 黑客用自己的
pri2
对key
进行解密,获取到明文的 key。 - 黑客为了隐藏自己,对明文的
key
使用服务器的pub
进行加密,返回给服务器。 - 黑客悄无声息的拿到明文的
key
,接下来客户端和服务器的数据传输都是不安全的。
证书
为了解决中间人攻击,客户端必须确认收到的公钥是服务器的,而不是被黑客篡改后的。
引入第三方的公信机构,来证明这个公钥是合法的,服务器上线前需要去机构申请一个证书。
证书中有一个重要的数据,加密后的签名,这个就是用来验证证书的合法性。
加密后的签名: 由证书中所有数据计算得到的一个校验和(签名),然后再用公信机构的私钥加密得到的。
引入证书后,客户端首先获取服务器的证书,然后校验证书的合法性,如果证书合法,就说明没被篡改,证书中服务器的公钥是合法的。
客户端如何验证证书的合法性:
-
客户端内置了公信机构的公钥,用这个公钥对证书中加密后的签名进行解密,得到明文签名。
-
然后用同样的算法计算校验和(签名)。
-
对比这两个签名,如果一致就证明了证书没有被篡改,是合法的,如果不一致,说明证书不合法。