共计 3287 个字符,预计需要花费 9 分钟才能阅读完成。
简介
在浏览器与服务器之间进行通信主要有 http 和 https 两种方式。对于 http 而言,这是一种明文传输的通信协议,这就让客户端与服务器之间的明文通信容易让黑客窃取甚至篡改,无法保证安全。因而引入了 https 协议,即 HTTP+SSL/TLS,这是一种在 http 协议的基础上加入了 SSL 层进行加解密保护,保证客户端和服务器之间的通信是安全的。
https 使用的算法
对称加密
对称加密算法是指通信双方拥有相同的密钥,在进行通信时发送方使用这个秘钥进行加密,接收方通过网络接收到密文后,使用相同的秘钥对密文进行解密得到明文。主要的对称加密算法有 DES、AES-GCM 等。
非对称加密
非对称加密的秘钥有公钥和私钥两个,一个通过公钥加密的消息只能由对应的私钥进行解密,而不能由公钥进行解密。同理,一个通过私钥加密的消息也只能由对应的公钥进行解密,不能通过私钥进行解密。在通信过程中,私钥自己保存,公钥对外发布,任何人都可以获得其他人发布的公钥。当发送方要发送消息时,使用接收方的公钥进行解密,接收方收到消息后,使用自己的私钥进行解密得到明文。常见的非对称加密算法主要有 RSA、DSA 等。
哈希算法
哈希算法主要是对一个消息进行散列求值,是一种将任意长度的数据压缩到某一固定长度的数据的算法。其具有不可逆性、抗冲突性和分布均匀性。其中不可逆性指从 hash 值推测出原先的数据是不可能的。抗冲突性指不存在两个不同的数据其 hash 结果是一样的。常见的哈希算法有 MD5、SHA256 等。
https「演进过程」
此部分主要参考《码农翻身》的「一个故事讲完 HTTPS」章节,并非 https 的真实演进过程。https 的通信过程可直接看数字证书版本章节。
http 版本
http 是以明文进行通信的,也就是说通信的内容容易被第三方窃取和篡改。下图是正常的通信过程
但是,由于其脆弱性,容易使通信内容被第三方篡改。如下图所示,客户端发送「Hello」给服务器,但是在中间被黑客篡改成「Goodbye」,服务器收到消息时,以为这是客户端发送的,并不知道这是被篡改的消息。同理,客户端也误以为黑客发送过来的消息是服务器发送的,这就造成了「误解」,从而做出错误的回应。当然,黑客也可以不篡改消息,而只是监听消息。例如对帐号和密码进行传输时,黑客就能通过这种方式轻易地获得对应的帐号和密码,从而使其遭受财产损失。
对称加密版本
由于 http 的极度不安全性,因此可以在客户端和服务器两侧进行某个秘钥的约定,这样在通信前对消息进行加密,接收方接收到消息后使用约定的秘钥进行解密,而黑客由于不知道秘钥,即使获取到消息也无法得知确切的内容,即使进行篡改,在接收方进行解密也会失败,从而保证消息传递的正确性。其通信过程大致如下所示
对称加密虽然解决了 http 的明文传输问题,但是其有一个苛刻的要求:客户端和服务器需要事先约定要秘钥并且不能被其他人知道。这个秘钥不能在没有保护情况下通过网络进行传输,否则黑客仍然能截取秘钥,从而对通信过程进行破坏。此外,服务器需要维护大量的与不同客户端进行通信的秘钥,这给服务器增加了负担。
非对称加密版本
由于使用对称加密进行通信需要维护大量的秘钥,并且需要在通信前约定好秘钥,这不太现实,因此将加密方式该成非对称加密。此方式主要是通信双方分别生成自己的公钥和私钥,然后对外公布公钥,私钥自己保存不泄漏。在通信前,先用对方的公钥对消息进行加密,然后发送消息,接收方在接收消息后用自己的私钥进行解密得到明文。这样就不用事先约定好秘钥了,因为对方的公钥是对外公布的,任何人都能获得,而也只有对应的私钥才能解密用公钥加密的密文,因此也不用担心传输过程中消息被窃取。同时也不用维护多个秘钥了,因为只需要维护好自己的私钥即可。其通信过程大致如下所示
使用非对称加密的 http 进行传输,虽然保证传输内容不被窃取,但是却无法保证传输内容被篡改。因为公钥是对外发布的,任何人都能获得公钥,但发送方使用服务器的公钥进行加密发送消息时,黑客可以截取消息,然后将自己的消息用服务器的公钥进行加密后发送给服务器,服务器接收到消息,因为可以用自己的私钥进行解密,所以仍然认为这是客户端发送的消息,此时就达到了攻击的目的。其通信过程大致如下所示
对称加密与非对称加密结合版本
非对称加密的 http 通信除了可以被黑客篡改内容外,还有一个性能问题。使用非对称加解密的速度远远比不上对称加解密的速度。为了解决这问题,采用了常用的折中方法进行处理:同时使用对称加密和非对称加密方式。具体表现为:刚开始时使用非对称加密进行通信,在确认对方身份后,约定一个秘钥并使用非对称加密的方式将秘钥传送给对方,后续使用基于此秘钥的对称加密方式进行通信。此方法不但可以解决非对称加密算法的性能问题,也可以非对称加密版本中被黑客篡改内容的问题,主要是因为攻击者虽然可以获取公钥,但是无法解密,所以攻击只能是整体篡改内容,再使用相同的公钥进行加密通信,但是在约定秘钥的过程中,攻击者虽然可以篡改秘钥,但是却无法让篡改的信息在通信双方都得到正确的解析,从而让通信方得知此消息不是来自目标者而放弃此次通信,从而使本次攻击失败。其失败的攻击过程大致如下所示
正常情况下,使用对称加密和非对称加密相结合的通信过程大致如下所示
虽然此版本避免了对称加密的维护大量秘钥的问题,也解决了非对称加密的篡改和性能问题,但是仍然无法解决「中间人」攻击的问题。因为此版本有一个大前提:客户端获取的服务器的公钥是正确的。如果这个公钥是黑客伪造的,那整个过程就相当于明文通信了。其攻击过程大致如下所示
数字证书版本
对称加密和非对称加密相结合的版本失效的原因是因为不能确定服务器的公钥真正地来自服务器而不是来自攻击者,所以引入数字证书来确定获取到的是真正服务器的公钥。数字证书主要包含以下内容:证书发行机构、证书有效期、证书所有者(给谁发的证书)及其公钥、证书发行机构的数字签名(对证书的基本信息进行哈希,然后使用自己的私钥对哈希值进行加密),其构成大致如下图所示
客户端在获取证书时,用证书发行机构的公钥对其进行解密获得哈希值,同时对证书的基本信息求哈希,将这两个哈希值进行比较,如果相同,则确定是服务器的公钥,否则认为有攻击。
此时又会有一个问题,如何确定证书发行机构的公钥是正确的呢?这就涉及到另一个问题了:操作系统和浏览器中会预先预置一些权威的经过认证的证书发行机构的数字证书(当然就包含其公钥了),如果要进行通信的服务器的数字证书是由这些证书发行机构发行的,那么就会认为是安全的可以进行通信,否则会提示不安全询问是否进行下一步操作。
使用数字证书进行通信的过程大致如下:首先客户端向服务器发送一个请求,服务器进行响应,同时把自己的数字证书发送给客户端,客户端对证书进行解析验证证书可靠性并获取服务端的公钥,然后用这个公钥对约定的秘钥进行加密发送给服务器,后续服务器和客户端之间用这个约定的秘钥进行对称加密的通信,其大致图示如下
用此版本进行通信,攻击者虽然也可以拦截并解密服务器发送包含公钥的数字证书,但是其却无法伪造服务器公钥,因为新计算的 hash 值与数字证书中的数字签名的 hash 值不一样,而因为攻击者没有证书发行机构的私钥,因此也无法伪造数字签名,这样客户端就能确保收到的公钥是服务器的公钥。在确认这一步后,接着约定秘钥的过程,攻击者因为没有服务器的私钥,也无法窥探和篡改,从而保证约定秘钥的过程也是安全的。在约定秘钥后,后续的通信使用对称加密的方式,攻击者因为没有对应的秘钥,因此也无法窥探和篡改通信消息。至此,可以确定用数字证书的方式进行 http 通信是安全可靠的。
总结
https 是使用数字证书,结合了对称加密算法、非对称加密算法和哈希算法的建立在 http 之上的安全通信协议。虽然其比 http 多了很多认证的步骤,但是其贵在安全,而这也是 web 应用中很重要的一个特征,因此在 web 应用中应该尽可能地使用 https 协议代替 http 协议进行通信。
参考资料
[1] 刘欣. 码农翻身 [M]. 北京:电子工业出版社,2018