1.HTTP的痛点
超文本传输协议HTTP通常用于在客户端和服务器端进行通信。但是,由于HTTP在发送消息时,不会对信息进行任何形式的加密,因此,可以说:在客户端和服务器端之间来回穿梭的消息都是处于“裸奔”状态。可以试想一下,我们的一举一动一切信息就这样随时都有可能被人偷窥。因此,HTTP不适合一些敏感信息(如密码、交易等)的传送。这是HTTP最大的痛点所在——不安全。
2.HTTPS相对于HTTP的改进
既然HTTP协议那么不安全,一个相对安全的HTTPS协议便诞生了。
HTTPS是在HTTP的基础上,又加入了SSL层,SSL层才是HTTPS安全性的关键所在。那么,SSL又是怎么保证安全性的呢?
总的来说,SSL层主要从两个方面保证了安全性:加密信息传输和身份验证。
2.1 加密信息传输
说到加密,有必要说说两种常见的加密方式:对称加密和非对称加密。
-
对称加密
顾名思义,这种加密方式中加密和解密方式是对称的,信息的加密和解密共用一个秘钥key。通常是发送方和接收方首先约定一个秘钥key,然后双方用同一个key进行相互通信。
那么问题来了:发送方和接收方如何约定这个共同的秘钥key呢?你可能会说:发送方发送信息的时候,直接把密钥连同信息一起发过去好了,可是,中间的恶意拦截者也可以轻松拿到密钥,并且拿到key之后也能轻松解密信息。
看到了吧,这种加密方法的症结就在于加密和解密都共用同一个密钥,恶意中间方拿到key之后可以轻易解密信息。发送方和接收方无法约定密钥,因为在信息世界,无论你怎么搞,约定密钥过程中都有可能被恶意中间方窃取到密钥,有了密钥就有了解开信息的钥匙! -
非对称加密
与对称加密不同,非对称加密会生成两个密钥:公钥和私钥。二者就像是磁铁正负两级:一段信息经过公钥加密,只有私钥才能解开;经过私钥加密,只有公钥才能解开。
这下好了,有了这种非对称加密算法,我们再来看看发送方和接收方约定密钥key的问题。
假设通信双方为A和B
- A首先生成公钥PubKey和私钥PriKey。
- A将私钥留在自己手里,只把公钥PubKey发送给B(恶意中间方窃取到PubKey并没什么用,因为PubKey加密的信息,只有PriKey才能解开,而PriKey在发送方手里!)。
- B收到公钥PubKey后,生成一个密钥key,并将其用PubKey加密,发送回给A。
- A收到后,用自己的私钥PriKey解开,得到B之前生成的key。
这样A和B便完成了一次密钥key的信息交换,达到了通信双方约定key的目的。
约定key完成之后,发送方和接受方将采用对称加密的方式进行后续的通信。
SSL层就是首先采用非对称加密完成双方约定key的过程,然后再使用对称加密的方式进行后续通信。
那么,为什么不直接用非对称加密来加密信息,而是通过非对称加密约定key,然后用key进行对称加密信息呢?原因在于非对称加密和解密的耗时比较长,因此为了提高效率,通常只用非对称加密交换密钥,真正的信息通信还是利用对称加密。
2.2 身份验证
2.1中提到SSL通过非对称加密和对称加密相结合的方式,实现信息的加密传输。但是,仍然存在被恶意中间层恶意攻击的危险。
看下面这种场景:
假设A和B要进行通信:
- A生成公钥和私钥,然后把公钥发给B。
- 中间者M伪装为B,并生成一个key,利用公钥加密,发回给A;这样,A以为和B建立了联系,实际上却是和M进行通信。
-
同时M自己生成另外一对公钥和私钥,将自己伪装成A,和B进行一次密钥交换。这样,B以为自己和A建立了联系,实际上却是和M进行通信。
这种情况下,M通过伪装,依然可以窃取A和B之间的通信信息。
为了解决身份认证的问题,SSL层引入了一个非常权威的第三方,我们称这个第三方为CA(Certificate Authority)。各个网站服务商可以向CA申请证书,CA则向网站服务商颁发证书。这样,以后网站之间在建立连接时带上他们的证书签名,如果只有建立连接的网站有合法的证书,才会被浏览器认为是安全的(浏览器安装时,会带有一个默认的安全的CA证书列表)。
那么,CA的证书可以完全信任吗?拥有它证书的网站就一定是安全的吗?答案是不一定,但通常情况下,是值得信任的。一旦某个CA颁发的某个证书被发现非法,那么这个CA颁发过的所有证书都会被认为非法,因此在这种惩罚措施下,CA颁发证书都会比较严格。
2.3 HTTPS工作原理
基于前面所说的“加密信息传输”和“身份验证”,HTTPS的工作原理就很容易理解了。我们详细看一下HTTPS的工作流程。
STEP1:首先,由客户端发起HTTPS请求。客户端发起请求时,会带上自己支持的加密规则和Hash算法列表。
HTTPS一般使用的加密与HASH算法如下:
- 非对称加密算法:RSA,DSA/DSS
- 对称加密算法:AES,RC4,3DES
- HASH算法:MD5,SHA1,SHA256
STEP2:服务器端收到客户端请求后,从客户端提供的加密规则列表中选择一组加密算法和HASH算法,并将自己的身份信息通过证书的形式发送给客户端。(证书信息包括:服务器地址、加密公钥、颁发机构等信息)。
STEP3:客户端收到证书信息,校验证书的合法性(浏览器有一个合法证书机构列表)。如果校验证书是合法的或者客户端用户选择信任不安全的证书,则客户端会生成一个随机的key,并用证书中提供的公钥加密。
STEP4:客户端将加密过后的key加密之后,发送给服务器端。
STEP5:服务器端收到之后,用证书中的私钥解密,得到key。这样,客户端和服务器端就完成了一次密钥交换。
STEP6:客户端和服务器端的以后通信都采用key进行对称加密的方式来进行。