HTTP 与 HTTPSHTTP 简介HTTP(Hyper Text Transfer Protocol,超文本传输协议),是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从 WWW 服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
但 HTTP 协议以明文方式传输数据,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP 协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
HTTPS 简介HTTPS(Hypertext Transfer Protocol Secure,安全套接字层超文本传输协议),是 HTTP 协议的安全版本。
由于 HTTP 协议传输的数据都是明文,未加密的,因此使用 HTTP 协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了 SSL(Secure Socket Layer,安全套接层)协议用于对 HTTP 协议传输的数据进行加密,从而就诞生了 HTTPS。
简单来说,HTTPS 协议是由 SSL + HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。而 SSL 依靠证书来验证服务器的身份,从而为浏览器和服务器之间的通信加密。
HTTPS 的主要作用有两点:
HTTPS 是如何保证数据安全的服务端与客户端使用明文传输数据的过程可能会被黑客截取数据,这时我们可以通过对数据进行加密的方式来保证数据安全,具体操作流程为:
这样,就保证了数据传输的安全性,这种加密和解密都用同一把密钥的方法称之为对称加密。
但这个策略存在的问题是,服务端是以明文的方式把这把密钥传输给客户端的,如果黑客截取了这把密钥,服务端与客户端就算是加密了内容,在截取了密钥的黑客眼里,这和明文没啥区别。
对称加密存在密钥会被截取的问题,那么,我们可以使用另一种加密方式:非对称加密,具体操作流程为:
这种加密和解密使用不用密钥的方法就是非对称加密。虽然,非对称加密解决了对称加密中密钥被截取的问题,但还是存在一个问题:
假如服务端在给客户端发送公钥过程中,被黑客截取了,并用自己的公钥冒充服务端的公钥发给客户端;这时,客户端收到公钥后,用公钥进行数据加密传输(此时用的公钥实际是黑客的公钥),黑客截取加密消息之后,就可以用他的私钥进行解密获取真实数据。在篡改了数据之后再用截取到服务端的公钥进行加密,之后再发给服务端。这样,数据就存在被篡改暴露的问题了。
也就是说,非对称加密之所以不安全,是因为收到了公钥之后,无法确定这把公钥的真实来源。
为了解决非对称加密的公钥来源问题,我们需要一种策略来证明公钥的来源不是被别人冒充的,而这种策略就是:数字证书。我们需要一个拥有公信力、大家都认可的认证中心(CA, Certificate Authority)。
1)生成数字证书
服务端在给客户端发送公钥过程中,会把公钥以及服务端自己的个人信息通过 Hash 算法生成消息摘要。
为了防止摘要被人拦截调换,服务端还会用 CA 提供的私钥(需要付费购买)对消息摘要进行加密形成数字签名。
最后再把原先未经过 Hash 算法的信息(服务端的公钥和个人信息)和数字签名合并在一起形成数字证书。整个流程如下图:

2)解析数字证书
客户端拿到这份数字证书之后,就会使用 CA 提供的公钥来对数字证书里面的数字签名进行解密得到消息摘要。然后对数字证书里面服务端的公钥和个人信息进行同样的 Hash 算法得到另一份消息摘要。最后把两份消息摘要进行对比,如果一样,则证明这些信息数据确实是来源服务端的,否则就不是。如图:

这时有人就会有疑问了,客户端是怎么拿到 CA 的公钥的?其实,原因很简单,常用的客户端,比如浏览器,一般都会内置一些常用的认证中心的公钥,但服务端的 CA 私钥是要申请购买的。
在传输数据的过程中,由于在速度上用对称加密的方法会比非对称加密的方法快很多,所以在传输数据的时候,一般不会只用非对称加密这种方法,而是会采用非对称加密 + 对称加密这两种结合的方法。实际的操作为:用非对称加密方法来安全传输密钥,之后再用对称加密的方法来传输消息内容。