HTTPS,为用户带上安全【套】

on
分类: https | 阅读量

本文为本人原创,欢迎分享,转载请注明【本文链接】

Thumper

一、国际惯例——概念

我们还是要给一个基本概念: 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吗?但是一个简单的字母,则隐藏了太多的东西与知识点在背后。

Thumper

二、图解

我们在使用http协议时,HTTP直接与TCP通信,当使用SSL时,则需要先与SSL通信,然后再由SSL和TCP通信。 在网络层表现如下:

Thumper

对于加密算法我不做过多赘述,我将其按方式分两种:

1、共享密钥加密:加密与解密使用同一个密钥;
2、公开密钥(非对称密钥):公开密钥使用一对非对称密钥。一把叫私有密钥,一把公有密钥; 

三、谈谈实现

那我们现在来想想,我们分别用上述两种方式来实现https,会有什么好处和坏处呢?

1、共享密钥加密

比如,王二狗要把自己的银行卡密码告诉杨铁柱:

Thumper Thumper

这个不用说,显然傻子都知道不行,在http通信过程中,加密和解密都会用到同一个密钥【喵喵喵】,只要找到对应加密的方式,我们是可能解析出其真正的内容的。 如果密钥被攻击者截取获得,此时加密就失去了意义。

Thumper

2、非对称密钥(公开加密方式)

what?
刚刚悄悄说都不行,那你现在还想把密钥直接告诉所有人咯?

Thumper

非也非也,非对称加密又称共享密钥加密,使用一对非对称的密钥,一把叫做私有密钥,另一把叫做公有密钥;公钥加密只能用私钥来解密,私钥加密只能用公钥来解密。常见的公钥加密算法有:RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫尔曼密钥交换协议中的公钥加密算法、椭圆曲线加密算法)。

Thumper

这个方案的好处主要有两个,划重点:

(1)这个私钥,一定只会有王二狗一个人知道,不然为什么叫私钥;
(2)我们无法从公钥来推导出私钥的内容 —— 体现了【非对称】的概念;

哦~ 那这个听起来蛮靠谱的嘛嘻嘻!我王二狗再也不用怕密码被偷听了!
然而,根据墨菲定律,这种看似没问题的事情,一定会有问题!王二狗怎么知道杨铁柱一定是杨铁柱本人?如果有人冒充他,那么一样可以派发私钥,那么不就被骗了吗?

3、证书

上面的问题,就引出了证书这个东西。我们平时上taobao或者其他网站,经常会看到浏览器这里有个安全的按钮,那么看看里面最主要是啥:

Thumper

这里写了证书是有效的,有效代表什么有效啊?继续划重点:

(1)代表我现在是在逛真的淘宝,不是山寨的;
(2)我在浏览器的所有操作都是安全的,除了淘宝和我,没有第三个人知道;

那么浏览器是怎么验证淘宝的证书的呢?一般我们去申请证书都是通过CA证书机构,同时大家都信任CA机构比如digicert verisign,我们就可以事先将这些CA机构的神器安装到我们的电脑上,也就是这些CA机构的公钥,我们也称它们为根证书。这些根证书是预先安装在我们电脑上的,所以每当我们访问taobao的时候,如果taobao服务器上安装了证书,他就可以和我们建立安全通信。

证书的大致内容:

(1)证书的发布机构CA
(2)证书的有效期
(3)公钥
(4)证书所有者
(5)签名
(6)其他

Thumper

哦~ 那这个听起来蛮靠谱的嘛,嘻嘻。。。好吧,你知道我又要告诉你有问题了: Thumper

公开密钥的方式,比共享密钥加密方式要复杂,如果我们所有通信都要用公开密钥的方式,通信的效率就会降低。

4、https的实现

考虑到以上的所有问题,https最终是采用的 共享密钥加密 + 非对称密钥 的混合加密方式:

(1)每次客户端(浏览器)先发起一个请求,say hello;
(2)Server回复一个hello,并把SSL证书发给浏览器;
(3)客户端与服务端都用公开密钥的方式加密,双方安全交换密钥。
(4)客户端持有公钥,服务端持有密钥。

Thumper

(5)后续就能愉快的通过共享密钥加密方式,进行通信了。

Thumper

四、小结

用一句话总结https:

HTTP + 加密 + 认证 + 完整性保护 = HTTPS

本文没有具体探讨加密算法与http的实现,有兴趣可以自行google,但是对于一般的开发人员,了解上述的知识点基本已够。

https, tcp/ip