前言:这是做为一个前端开发对 HTTPS 的浅显的理解,仅仅是可让你在看完文章以后对 HTTPS 的原理了解,具体的实现方式并无给出。有不对的地方欢迎指出。前端
本文首发于个人我的网站:cherryblog.site/算法
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,所以加密的详细内容就须要SSL。 如今它被普遍用于万维网上安全敏感的通信,例如交易支付方面。编程
前一段时间,公司要求对全栈使用 HTTPS,当时我还在想,HTTPS 不是只用于支付的环节吗,为何要全栈都使用 HTTPS,真的是图样图森破
其实使用 HTTPS 最主要的用处是如下两点:安全
在看 HTTPS 的时候,在 GOOGLE 搜索的大部分都是一些比较专业的术语,对于一个前端来讲,对这些什么应用层、传输层的协议和各类服务器的信息都不是很了解,因此看的不是很明白也看不进去,因而,看到一篇文章:一个故事讲完https 表示勉强能够理解,/(ㄒoㄒ)/~~,因而对其详细的研究了下,对于前端理解 HTTPS 仍是能够看一下的。服务器
本文其实就是对这篇文章的理解,不知道其余小伙伴都是什么水平,我是看 HTTPS 原理比较吃力的网络
来自中国的张大胖和位于米国的 Bill 进行通讯异步
因为张大胖和 Bill 都是使用 HTTP 进行通讯,HTTP 是明文的,因此他们的聊天都是可被窥视的。因而,二人准备想要改变现状,因此 HTTPS 首先要解决的问题就是要保证传输的内容只有这两我的能看懂网站
两人商量了一下,可使用对称密钥进行加密。(对称密钥也就是加密和解密使用的是同一个密钥)加密
可是问题又来了~既然网络是不安全的,那么最开始的时候怎么将这个对称密钥发送出去呢?若是对称密钥在发送的时候就已经被拦截,那么发送的信息仍是会被篡改和窥视啊~~3d
因此这种对称密钥的弊端就是,可能被中间人拦截,这样中间人就能够获取到了密钥,就能够对传输的信息就行窥视和篡改。
RSA(非对称加密算法):双方必须协商一对密钥,一个私钥一个公钥。用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据, 只有对应的私钥才能解密。
这样的话 Bill 将本身的公钥给张大胖,张大胖发送的信息使用 Bill 的公钥加密,这样,只有 Bill 使用本身的私钥才能获取
可是这样有个弊端:
因此为了解决这个问题,咱们使用非对称密钥+对称密钥结合的方式
使用对称密钥的好处是速度比较快,使用非对称密钥的好处是可使得传输的内容不能被破解,由于就算你拦截到了数据,可是没有 Bill 的私钥,也是不能破解内容的。就好比说你抢了一个保险柜,可是没有保险柜的钥匙也不能打开保险柜。
因此咱们要结合二者的优势。使用 RSA 的方法将加密算法的对称密钥发送过去,以后就可使用使用这个密钥,利用对称密钥来通讯了。就好比说我将钥匙放进了保险柜,而后将保险柜寄给对方。
还有一个问题就是在使用非对称密钥的时候,首先须要将 Bill 的公钥给张大胖,那么在这个过程当中,安全是没有保障的,中间人能够拦截到 Bill 的公钥,就能够对拦截到的公钥进行篡改。
这也就是至关于我有手机号,虽然是公开的,谁均可以给我打电话,可是刚开始你并不知道个人手机号,我须要将个人手机号发给你,在我发给你个人手机号的时候,被中间人拦截了,而后将我正确的手机号换成了错误的手机号,好比:110,而后,你收到的就是错误的手机号:110,可是你本身还不知道你收到的是错的手机号,这时候,你要是给我打电话,就尴尬了~~
因此以上的步骤都是可行的,只须要最后一点就能够了,要肯定 Bill 给张大胖的公钥确实是 Bill。 的公钥,而不是别人的。(刚刚电话号码的那个例子,也就是说,须要肯定我给你发的电话号码是个人,没有被修改的)
那怎么确认 Bill 给张大胖的公钥确实是 Bill 的呢?
这个时候就须要公证处的存在了。也就是说我须要先将个人电话号码到公证处去公证一下,而后我将电话号码传给你以后,你在将你收到的电话号码和公证处的比对下,就知道是否是个人了。
对应到计算机世界,那就是数字签名
数字签名也就是至关于公证处在公证书上盖章。
数字签名和原始信息合在一块儿称为数字证书,Bill 只需将数字证书发送给张大胖就能够了。
在拿到数字证书以后,就用一样的Hash 算法, 再次生成消息摘要,而后用CA的公钥对数字签名解密, 获得CA建立的消息摘要, 二者一比,就知道有没有人篡改了!
以上你所有看完而且理解了,那么对于 HTTPS 你也就大概有个了解了。
据说写文章能够得异步社区的书,异步社区做为国内顶尖的IT专业图书社区,它的书我很是想要,因此我竭力写了这篇文章,我想要这本书(《Python极客项目编程》,