143

谈谈 HTTPS

 6 years ago
source link: https://juejin.im/post/59e4c02151882578d02f4aca
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言:这是作为一个前端开发对 HTTPS 的浅显的理解,仅仅是可以让你在看完文章之后对 HTTPS 的原理了解,具体的实现方式并没有给出。有不对的地方欢迎指出。

本文首发于我的个人网站:cherryblog.site/

什么是 HTTPS

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

HTTP 与 HTTPS 的区别

  • HTTP 是明文传输,HTTPS 通过 SSL\TLS 进行了加密
  • HTTP 的端口号是 80,HTTPS 是 443
  • HTTPS 需要到 CA 申请证书,一般免费证书很少,需要交费
  • HTTPS 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。

为什么要使用 HTTPS

前一段时间,公司要求对全栈使用 HTTPS,当时我还在想,HTTPS 不是只用于支付的环节吗,为什么要全栈都使用 HTTPS,真的是图样图森破
其实使用 HTTPS 最主要的用处是以下两点:

  • 建立一个信息安全通道,来保证数据传输的安全
  • 确认网站的真实性,防止钓鱼网站

HTTPS 原理

在看 HTTPS 的时候,在 GOOGLE 搜索的大部分都是一些比较专业的术语,对于一个前端来说,对这些什么应用层、传输层的协议和各种服务器的信息都不是很了解,所以看的不是很明白也看不进去,于是,看到一篇文章:一个故事讲完https 表示勉强可以理解,/(ㄒoㄒ)/~~,于是对其详细的研究了下,对于前端理解 HTTPS 还是可以看一下的。

本文其实就是对这篇文章的理解,不知道其他小伙伴都是什么水平,我是看 HTTPS 原理比较吃力的

来自中国的张大胖和位于米国的 Bill 进行通信

总是有一种被偷看的感觉

由于张大胖和 Bill 都是使用 HTTP 进行通信,HTTP 是明文的,所以他们的聊天都是可被窥视的。于是,二人准备想要改变现状,所以 HTTPS 首先要解决的问题就是要保证传输的内容只有这两个人能看懂

plan1:使用对称密钥

使用对称密钥
使用对称密钥

两人商量了一下,可以使用对称密钥进行加密。(对称密钥也就是加密和解密使用的是同一个密钥)

但是问题又来了~既然网络是不安全的,那么最开始的时候怎么将这个对称密钥发送出去呢?如果对称密钥在发送的时候就已经被拦截,那么发送的信息还是会被篡改和窥视啊~~

所以这种对称密钥的弊端就是,可能被中间人拦截,这样中间人就可以获取到了密钥,就可以对传输的信息就行窥视和篡改。

plan2:使用非对称密钥

使用非对称密钥
使用非对称密钥

RSA(非对称加密算法):双方必须协商一对密钥,一个私钥一个公钥。用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据, 只有对应的私钥才能解密。

非对称加密算法
非对称加密算法

这样的话 Bill 将自己的公钥给张大胖,张大胖发送的信息使用 Bill 的公钥加密,这样,只有 Bill 使用自己的私钥才能获取

但是这样有个弊端:

  • RSA 算法很慢= =,要慢很多

所以为了解决这个问题,我们使用非对称密钥+对称密钥结合的方式

plan3:非对称密钥+对称密钥

使用对称密钥的好处是速度比较快,使用非对称密钥的好处是可以使得传输的内容不能被破解,因为就算你拦截到了数据,但是没有 Bill 的私钥,也是不能破解内容的。就比如说你抢了一个保险柜,但是没有保险柜的钥匙也不能打开保险柜。

所以我们要结合两者的优点。使用 RSA 的方法将加密算法的对称密钥发送过去,之后就可以使用使用这个密钥,利用对称密钥来通信了。就比如说我将钥匙放进了保险柜,然后将保险柜寄给对方。

中间人攻击

还有一个问题就是在使用非对称密钥的时候,首先需要将 Bill 的公钥给张大胖,那么在这个过程中,安全是没有保障的,中间人可以拦截到 Bill 的公钥,就可以对拦截到的公钥进行篡改。

这也就是相当于我有手机号,虽然是公开的,谁都可以给我打电话,但是刚开始你并不知道我的手机号,我需要将我的手机号发给你,在我发给你我的手机号的时候,被中间人拦截了,然后将我正确的手机号换成了错误的手机号,比如:110,然后,你收到的就是错误的手机号:110,但是你自己还不知道你收到的是错的手机号,这时候,你要是给我打电话,就尴尬了~~

确认身份 —— 数字证书

所以以上的步骤都是可行的,只需要最后一点就可以了,要确定 Bill 给张大胖的公钥确实是 Bill。 的公钥,而不是别人的。(刚刚电话号码的那个例子,也就是说,需要确定我给你发的电话号码是我的,没有被修改的)

那怎么确认 Bill 给张大胖的公钥确实是 Bill 的呢?

这个时候就需要公证处的存在了。也就是说我需要先将我的电话号码到公证处去公证一下,然后我将电话号码传给你之后,你在将你收到的电话号码和公证处的比对下,就知道是不是我的了。

对应到计算机世界,那就是数字签名

数字签名
数字签名

数字签名也就是相当于公证处在公证书上盖章。

数字证书
数字证书

数字签名和原始信息合在一起称为数字证书,Bill 只需将数字证书发送给张大胖就可以了。

在拿到数字证书之后,就用同样的Hash 算法, 再次生成消息摘要,然后用CA的公钥对数字签名解密, 得到CA创建的消息摘要, 两者一比,就知道有没有人篡改了!

对比消息摘要是否相同

以上你全部看完并且理解了,那么对于 HTTPS 你也就大概有个了解了。

听说写文章可以得异步社区的书,异步社区作为国内顶尖的IT专业图书社区,它的书我非常想要,所以我竭力写了这篇文章,我想要这本书(《Python极客项目编程》

大家如果觉得好给我点个赞吧

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK