1 为什么需要HTTPS?
HTTP 在进行数据传输时采用明文传输,数据包中的用户信息等隐私数据可以被第三方通过抓包等方式窃取,是不安全的。
如果客户端使用 MD5 加密算法对数据进行加密,由于加密后的结果是不可逆的,服务器无法进行解析,只能使用加密后的字符串进行校验用户身份,而第三方也可以获取数据包中的加密字符串,从而骗取服务器的信任,所以也无法通过 MD5 加密算法解决 HTTP 传输不安全的问题。
为了解决 HTTP 明文传输不安全的问题,比 HTTP 安全的 HTTPS 应运而生。
2 HTTPS是什么?
HTTPS = HTTP + SSL/TLS。HTTPS 使用 HTTP 进行通信,并使用 SSL/TLS 在进行数据传输时对数据包进行加密,确保数据进行安全传输。
SSL (Secure Sockets Layer) 是由 Netscape 公司设计的用于 Web 的安全通信协议,开发至 3.0 版本后交由 IETF 进行标准化,IETF 在 SSL 3.0 基础上开发出了 TLS 1.0 (Transport Layer Security),并写入了 RFC。
3 对称加密与非对称加密
3.1 对称加密
对称加密,顾名思义,通信双方采用相同的密钥对数据进行加解密,常见的对称加密算法有 AES、DES、3DES等。
通信过程:在接收到客户端的请求后,服务器生成一把密钥,并通过网络发送给客户端,客户端拿到密钥后对数据进行加密,将加密后的数据发送给服务器,服务器再使用密钥对数据进行解密。
优点:加解密计算量小,速度快。
缺点:由于只有一个密钥供通信双方使用,所以密钥需要在一方生成后传输给另一方,在传输过程中存在被截获的风险。
3.2 非对称加密
非对称加密,顾名思义,加密和解密使用不同的密钥:公钥 (Public Key) 和私钥 (Private Key)。公钥和私钥是一对密钥,使用公钥加密的数据只能通过对应的私钥解密,使用私钥加密的数据也只能通过对应的公钥解密。常见的非对称加密算法有 RSA 等。
通信过程:在接收到客户端的请求后,服务器生成一对密钥,并将其中一把作为公钥通过网络发送给客户端,客户端拿到公钥后对数据进行加密,将加密后的数据发送给服务器,服务器使用私钥对数据进行解密。
优点:加密和解密使用不同的密钥,私钥不用进行网络传输,安全性高。
缺点:加解密计算量大,速度慢,资源占用大。
4 HTTPS原理
HTTPS 采用混合加密方式进行数据传输。考虑到对称加密的密钥可能被截获以及非对称加密计算量大,速度慢的缺点,先采用非对称加密传输密钥,然后采用对称加密对数据包进行加解密。
在接收到客户端的请求后,服务器生成一对公钥和私钥,并把公钥发送给客户端,客户端拿到公钥后,生成用于对称加密的密钥 KEY,然后用公钥对 KEY 进行加密并发送给服务器,服务器接收到后使用私钥进行解密获得 KEY,然后客户端和服务器就可以使用这个相同的 KEY 对数据包进行加解密,如下图所示。
但是,按照上述过程就能保证安全了吗?
答案是否定的。貌似我们对服务器发出的公钥有很强的信任。试想一下,客户端和服务器之间有个中间人,其也可以获取服务器发出的公钥,如果他拦截了服务器要发送给客户端的公钥,并伪造了一把公钥然后再发送给客户端,在客户端使用伪造的公钥加密 KEY 并发出后进行拦截,那么他就可以窃取到客户端生成的 KEY,从而可以获取到客户端与服务器之间通信的数据包中的用户信息,导致严重的后果。
那么,如何确保客户端收到的公钥是可信的呢?这就需要能够证明服务器身份的数字证书了。
采用 HTTPS 通信的服务器需要向第三方数字证书认证机构 (CA) 申请数字证书(需要付费,安全等级越高价格越贵),机构在进行审核后会颁发电子证书,同时产生一对公钥和私钥,私钥由服务器自己保存,公钥则附加在证书信息中,与证书一起公开。证书本身也带有一个电子签名,该签名用于校验证书的完整性和真实性,可以防止证书被篡改。
所以,在进行数据传输前会增加证书验证的过程。服务器接收到客户端的请求后,将数字证书发送给客户端,里面包含了公钥。客户端接收到证书后会对证书进行校验,校验不通过则会向用户提示警告信息。校验通过后则取出公钥并对 KEY 进行加密,然后发送给服务器,服务器接收到加密后的 KEY 以后使用私钥进行解密,然后客户端和服务器采用对称加密的方式进行数据传输,如下图所示。