参考来源:http://windblog.cn/https/2018/12/31/https/
一、国际惯例——概念
我们还是要给一个基本概念: HTTP 协议(HyperText Transfer Protocol,超文本传输协议):是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。
HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):可以理解为HTTP+SSL/TLS, 即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL,用于安全的 HTTP 数据传输。 周所周知,在登录网页时,https不就是比http多了一个s吗?但是一个简单的字母,则隐藏了太多的东西与知识点在背后。
二、图解
我们在使用http协议时,HTTP直接与TCP通信,当使用SSL时,则需要先与SSL通信,然后再由SSL和TCP通信。 在网络层表现如下:
对于加密算法我不做过多赘述,我将其按方式分两种:
1、共享密钥加密:加密与解密使用同一个密钥;
2、公开密钥(非对称密钥):公开密钥使用一对非对称密钥。一把叫私有密钥,一把公有密钥;
三、谈谈实现
那我们现在来想想,我们分别用上述两种方式来实现https,会有什么好处和坏处呢?
1、共享密钥加密
比如,王二狗要把自己的银行卡密码告诉杨铁柱:
这个不用说,显然傻子都知道不行,在http通信过程中,加密和解密都会用到同一个密钥【喵喵喵】,只要找到对应加密的方式,我们是可能解析出其真正的内容的。 如果密钥被攻击者截取获得,此时加密就失去了意义。
2、非对称密钥(公开加密方式)
what?
刚刚悄悄说都不行,那你现在还想把密钥直接告诉所有人咯?
非也非也,非对称加密又称共享密钥加密,使用一对非对称的密钥,一把叫做私有密钥,另一把叫做公有密钥;公钥加密只能用私钥来解密,私钥加密只能用公钥来解密。常见的公钥加密算法有:RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫尔曼密钥交换协议中的公钥加密算法、椭圆曲线加密算法)。
这个方案的好处主要有两个,划重点:
(1)这个私钥,一定只会有王二狗一个人知道,不然为什么叫私钥;
(2)我们无法从公钥来推导出私钥的内容 —— 体现了【非对称】的概念;
哦~ 那这个听起来蛮靠谱的嘛嘻嘻!我王二狗再也不用怕密码被偷听了!
然而,根据墨菲定律,这种看似没问题的事情,一定会有问题!王二狗怎么知道杨铁柱一定是杨铁柱本人?如果有人冒充他,那么一样可以派发私钥,那么不就被骗了吗?
3、证书
上面的问题,就引出了证书这个东西。我们平时上taobao或者其他网站,经常会看到浏览器这里有个安全的按钮,那么看看里面最主要是啥:
这里写了证书是有效的,有效代表什么有效啊?继续划重点:
(1)代表我现在是在逛真的淘宝,不是山寨的;
(2)我在浏览器的所有操作都是安全的,除了淘宝和我,没有第三个人知道;
那么浏览器是怎么验证淘宝的证书的呢?一般我们去申请证书都是通过CA证书机构,同时大家都信任CA机构比如digicert verisign,我们就可以事先将这些CA机构的神器安装到我们的电脑上,也就是这些CA机构的公钥,我们也称它们为根证书。这些根证书是预先安装在我们电脑上的,所以每当我们访问taobao的时候,如果taobao服务器上安装了证书,他就可以和我们建立安全通信。
证书的大致内容:
(1)证书的发布机构CA
(2)证书的有效期
(3)公钥
(4)证书所有者
(5)签名
(6)其他
哦~ 那这个听起来蛮靠谱的嘛,嘻嘻。。。好吧,你知道我又要告诉你有问题了:
公开密钥的方式,比共享密钥加密方式要复杂,如果我们所有通信都要用公开密钥的方式,通信的效率就会降低。
4、https的实现
考虑到以上的所有问题,https最终是采用的 共享密钥加密 + 非对称密钥 的混合加密方式:
(1)每次客户端(浏览器)先发起一个请求,say hello;
(2)Server回复一个hello,并把SSL证书发给浏览器;
(3)客户端与服务端都用公开密钥的方式加密,双方安全交换密钥。
(4)客户端持有公钥,服务端持有密钥。
(5)后续就能愉快的通过共享密钥加密方式,进行通信了。
四、小结
用一句话总结https:
HTTP + 加密 + 认证 + 完整性保护 = HTTPS
本文没有具体探讨加密算法与http的实现,有兴趣可以自行google,但是对于一般的开发人员,了解上述的知识点基本已够。