做为一个有追求的程序员,了解行业发展趋势和扩充本身的计算机知识储备都是颇有必要的,特别是一些计算机基础方面的内容,就好比本篇文章要讲的计算机网络方面的知识。本文将为你们详细梳理一下 HTTPS 的实现原理。html
近年来,随着用户和互联网企业安全意识的提升和 HTTPS 成本的降低,HTTPS 已经愈来愈普及。不少互联网巨头也在力推 HTTPS,好比谷歌的 Chrome 浏览器在访问 HTTP 网站时会在地址栏显示不安全的提醒,微信要求全部的小程序必须使用 HTTPS 传输协议,苹果也要求全部在 App Store 上架的应用必须采用 HTTPS ,国内外的大部分主流网站也都已迁移至 HTTPS,可见 HTTPS 全面取代 HTTP 只是时间问题。前端
说了这么多,究竟什么是 HTTPS,它与 HTTP 相比有什么优缺点?其底层原理又是怎么实现的呢?下面就为你一一解答,先来看一下 HTTP 的弊端吧。程序员
HTTP 之因此被 HTTPS 取代,最大的缘由就是不安全,至于为何不安全,看了下面这张图就一目了然了。算法
图1. HTTP数据传输过程小程序
由图可见,HTTP 在传输数据的过程当中,全部的数据都是明文传输,天然没有安全性可言,特别是一些敏感数据,好比用户密码和信用卡信息等,一旦被第三方获取,后果不堪设想。这里可能有人会说,我在前端页面对敏感数据进行加密不就好了,好比 MD5 加盐加密。这么想就太简单了。首先 MD5 并非加密算法,其全称是 Message Digest Algorithm MD5,意为信息摘要算法,是一种不可逆的哈希算法,也就是说通过前端 MD5 处理过的数据在服务器端是没法复原的。这里以密码举例,前端把用户密码经过 MD5 进行处理,并把获得的哈希值发送给服务器,服务器因为没法复原密码,就会直接用这个哈希值处理用户请求。因此第三方在获取这个哈希值后,能够绕过前端登陆页面直接访问服务器,形成安全问题。另外,MD5 算法自己的安全性也存在缺陷,这里就不展开谈了。segmentfault
总之 MD5,SHA-1 之类的哈希算法并不能让 HTTP 变得更安全。要想让 HTTP 更安全,只能使用真正的加密算法,由于加密算法能够用密钥加密并还原数据,只要确保密钥不被第三方获取,那就能确保数据传输的安全了。而这正是 HTTPS 的解决方案,那下面就来了解一下加密算法吧。浏览器
HTTPS 解决数据传输安全问题的方案就是使用加密算法,具体来讲是混合加密算法,也就是对称加密和非对称加密的混合使用,这里有必要先了解一下这两种加密算法的区别和优缺点。安全
对称加密,顾名思义就是加密和解密都是使用同一个密钥,常见的对称加密算法有 DES、3DES 和 AES 等,其优缺点以下:服务器
本文不对具体的加密算法作详细介绍,有兴趣的同窗能够参考 对称加密算法详解,若是直接将对称加密算法用在 HTTP 中,会是下面的效果:微信
图2. 对称加密数据传输过程
从图中能够看出,被加密的数据在传输过程当中是无规则的乱码,即使被第三方截获,在没有密钥的状况下也没法解密数据,也就保证了数据的安全。可是有一个致命的问题,那就是既然双方要使用相同的密钥,那就必然要在传输数据以前先由一方把密钥传给另外一方,那么在此过程当中密钥就颇有可能被截获,这样一来加密的数据也会被轻松解密。那如何确保密钥在传输过程当中的安全呢?这就要用到非对称加密了。
非对称加密,顾名思义,就是加密和解密须要使用两个不一样的密钥:公钥(public key)和私钥(private key)。公钥与私钥是一对,若是用公钥对数据进行加密,只有用对应的私钥才能解密;若是用私钥对数据进行加密,那么只有用对应的公钥才能解密。非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把做为公钥对外公开;获得该公钥的乙方使用公钥对机密信息进行加密后再发送给甲方;甲方再用本身保存的私钥对加密后的信息进行解密。若是对公钥和私钥不太理解,能够想象成一把钥匙和一个锁头,只是全世界只有你一我的有这把钥匙,你能够把锁头给别人,别人能够用这个锁把重要的东西锁起来,而后发给你,由于只有你一我的有这把钥匙,因此只有你才能看到被这把锁锁起来的东西。经常使用的非对称加密算法是 RSA 算法,想详细了解的同窗点这里:详解一、详解二,其优缺点以下:
因为非对称加密的强安全性,能够用它完美解决对称加密的密钥泄露问题,效果图以下:
图3. 客户端经过非对称加密把密钥 KEY 发送给服务器
在上述过程当中,客户端先是经过非对称加密把以后用于对称加密的密钥 KEY 返送给客户端,而后双方再使用 KEY 进行对称加密交互数据。在非对称加密的数据传输过程当中,即使第三方获取了公钥和加密后的 KEY,在没有私钥的状况下也没法破解 KEY (私钥存在服务器,泄露风险极小),也就保证了接下来对称加密的数据安全。而上面这个流程图正是 HTTPS 的雏形,HTTPS 正好综合了这两种加密算法的优势,不只保证了通讯安全,还保证了数据传输效率。
先看一下维基百科对 HTTPS 的定义
Hypertext Transfer Protocol Secure (HTTPS) is an extension of the Hypertext Transfer Protocol (HTTP). It is used for secure communication over a computer network, and is widely used on the Internet. In HTTPS, the communication protocol is encrypted using Transport Layer Security (TLS) or, formerly, its predecessor, Secure Sockets Layer (SSL). The protocol is therefore also often referred to as HTTP over TLS, or HTTP over SSL.
HTTPS (Hypertext Transfer Protocol Secure) 是基于 HTTP 的扩展,用于计算机网络的安全通讯,已经在互联网获得普遍应用。在 HTTPS 中,原有的 HTTP 协议会获得 TLS (安全传输层协议) 或其前辈 SSL (安全套接层) 的加密。所以 HTTPS 也常指 HTTP over TLS 或 HTTP over SSL。
可见HTTPS 并不是独立的通讯协议,而是对 HTTP 的扩展,保证了通讯安全,两者关系以下:
图4. HTTP和HTTPS的关系
也就是说 HTTPS = HTTP + SSL / TLS。
接下来就是最重要的 HTTPS 原理解析了,老规矩先上图。
图5. HTTPS 加密、解密、验证及数据传输过程
看上去眼花缭乱,不要怕,且听我细细道来。HTTPS 的整个通讯过程能够分为两大阶段:证书验证和数据传输阶段,数据传输阶段又能够分为非对称加密和对称加密两个阶段。具体流程按图中的序号讲解。
客户端请求 HTTPS 网址,而后链接到 server 的 443 端口 (HTTPS 默认端口,相似于 HTTP 的80端口)。
采用 HTTPS 协议的服务器必需要有一套数字 CA (Certification Authority)证书,证书是须要申请的,并由专门的数字证书认证机构(CA)经过很是严格的审核以后颁发的电子证书 ( (固然了是要钱的,安全级别越高价格越贵))。颁发证书的同时会产生一个私钥和公钥。私钥由服务端本身保存,不可泄漏。公钥则是附带在证书的信息中,能够公开的。证书自己也附带一个证书电子签名,这个签名用来验证证书的完整性和真实性,能够防止证书被篡改。
服务器响应客户端请求,将证书传递给客户端,证书包含公钥和大量其余信息,好比证书颁发机构信息,公司信息和证书有效期等。Chrome 浏览器点击地址栏的锁标志再点击证书就能够看到证书详细信息。
图6. B站 CA 证书
图7. 浏览器安全警告
若是证书没有问题,客户端就会从服务器证书中取出服务器的公钥A。而后客户端还会生成一个随机码 KEY,并使用公钥A将其加密。
客户端把加密后的随机码 KEY 发送给服务器,做为后面对称加密的密钥。
服务器在收到随机码 KEY 以后会使用私钥B将其解密。通过以上这些步骤,客户端和服务器终于创建了安全链接,完美解决了对称加密的密钥泄露问题,接下来就能够用对称加密愉快地进行通讯了。
服务器使用密钥 (随机码 KEY)对数据进行对称加密并发送给客户端,客户端使用相同的密钥 (随机码 KEY)解密数据。
双方使用对称加密愉快地传输全部数据。
好了,以上就是 HTTPS 的原理详解了,如此精美的图搭配这么详细的过程解析,你再搞不懂就说不过去了吧哈哈。
再来总结一下 HTTPS 和 HTTP 的区别以及 HTTPS 的缺点吧:
HTTPS 和 HTTP 的区别:
HTTPS 的缺点:
好了,以上就是本篇文章的所有内容了,若有错误,欢迎指正。最后贴几篇参考文章