加密算法
众所周知,加密算法主要分为对称和非对称加密,对称加密就是大家使用相同的密钥完成加解密,这也是人类历史上长期运用的消息安全传递方法,这个方法有一个明显的缺点就是密钥的唯一性所带来的可能出现多个异地保存的副本,比如一份密码本对于消息的加解密人员必须人手一份才能正常完成工作,一旦有一份密码本泄露出去到了第三方的手中,加密体系的保密性也就不复存在了。
随着数学和计算机技术的发展,人们终于发明了非对称加密算法以解决密钥的唯一性问题,这时产生了一对密钥,这对密钥可以实现相互加解密。你可以将一份密钥(私钥)掌握在自己手中,将另一份密钥(公钥)放出去,其他人得到公钥,用公钥对信息进行加密后发送给你,你就可以用手中的私钥对消息进行解密,你也可以反向用自己的私钥加密信息发给其他掌握了公钥的人,他们用公钥来解密你的加密信息。在非对称加密体系中,你只需要照顾好自己手中的私钥不要遗失,不用担心公钥的泄露会造成安全隐患。另外,非对称加密算法的好处远远超过了只是消息加密的范畴,当消息发送方手中牢牢掌握了自己的私钥的时候,消息接收方有理由相信,当他使用发送方给他的公钥成功完成消息解密的同时,发送方的身份也就得到的验证。但更加安全的代价就是非对称加密算法的性能相对于对称加密算法要慢得多。
HTTPS工作流程
基本概念
有人会说既然有了非对称加密算法,那么直接利用它就可以实现浏览器与Web服务器间通信消息的加解密了。但你要明白一切保障信息安全的手段都是在牺牲性能和易用性的代价下展开的,确实可以在消息传递中直接利用非对称加密算法来实现消息的加解密,但在浏览器与Web服务器之间HTTP协议如此频繁和体积巨大的消息通信场景下,非对称加密算法的性能问题就凸显出来,如果直接采用,将极大影响协议的整体性能。于是,人们就采用变通的方法,同时利用非对称加密算法和对称加密算法实现针对HTTP消息传递的加解密,其中非对称加密算法只参与到对对称加密算法密钥(对话密钥)的加密过程中,而大块消息的加解密则由浏览器和Web服务器间协商好的对称加密算法来完成。
另外,任何Web服务器都有可能向浏览器提供建立HTTPS连接所需要的公钥,这里就排除不了一些假冒的服务器提供一些自己伪造的公钥,为了确保Web服务器是值得我浏览器信任的,于是引入了数字证书的概念。为了证明自己是值得信赖的,Web服务器需要向第三方CA机构申请一个数字证书,证书中包含了证书基本信息和服务器的公钥信息,证书的最后面是一个由CA机构的私钥对证书上述信息计算摘要后加密的消息签名信息。浏览器内置了一些权威的根证书,这些根证书中带有对应其发证CA机构的公钥,一旦得到Web服务器的数字证书,浏览器会在第一时间来根据证书信息查找是否存在对应的根证书,如果存在,利用根证书中的公钥解密Web服务器数字证书中的消息签名信息,并与自己计算的证书摘要信息进行比对,从而验证其真实性和完整性,只要通过验证,浏览器会自动信任由这些权威机构颁发的证书。当然在某些特定场景下Web服务器也需要浏览器提供数字证书以证明其可信度。
工作流程
HTTPS采用SSL/TLS协议实现在通信安全上的保障,主要分为握手阶段和对话阶段。
其中握手阶段的大致的工作流程如下:
(1)首先,浏览器会向服务器发起HTTPS请求,请求消息中包含了自己当前所采用的SSL/TLS协议的版本信息,一个随机数(用于生成在对话阶段的对称加密密钥)支持的加密算法。另外,还将向服务器索要数字证书;
(2)服务器回应浏览器的请求,响应消息中包含确认使用与浏览器相同版本的SSL/TLS协议的回应,一个随机数(用于生成在对话阶段的对称加密密钥),确认将使用浏览器支持的加密算法完成加解密。并将数字证书发给浏览器;
(3)浏览器接到服务器的数字证书后,判断其是否值得信任,如果信任,获取服务器的公钥,将生成一个随机数(用于生成在对话阶段的对称加密密钥)并使用服务器提供的公钥进行加密,向服务器发送请求消息,请求消息中包含了加密后的随机数,编码改变的通知(表示随后的信息都将用双方商定的加密方法和密钥发送),浏览器握手阶段结束的通知(包含一个之前所有信息的摘要值以校验是否握手阶段通信信息完整)。
(4)服务器确认通知,通过自己的私钥解密被加密随机数,并回应浏览器的请求,响应消息为编码改变的通知(表示随后的信息都将用双方商定的加密方法和密钥发送),服务器握手阶段结束的通知(包含一个之前所有信息的摘要值以校验是否握手阶段通信信息完整)。
对话阶段就将采用由三次产生随机数所生成的对称加密密钥对HTTP消息进行加解密的传输。