plainify

身份认证之双因素认证 2FA

身份认证 这里所说的身份认证,指的是狭义上的在计算机及其网络系统中确认操作者身份的过程,从而确定用户是否具有访问或操作某种资源的权限。 之所以要在互联网中进行身份认证,是为了防止攻击者假冒你的身份在系统中进行不利于你的操作。试想一下,万一哪天早晨起来你发现你的支付宝账号被盗了,你余额宝里的钱全没了,那岂不是亏大了。 只不过,和现实世界不同的是,网络世界中一切信息都是用一组特定的数据来表示的,计算机只能识别用户的数字身份,所以对用户的授权本质上就是针对用户数字身份的授权。 因此,如何保证操作者的物理身份和数字身份相对应,就成了一个至关重要的议题了,身份认证也因此在互联网世界中起着举足轻重的作用了。本文将会介绍目前很多网站常用的一种方式——双因素认证(也叫两步验证,英语:Two-factor authentication,缩写为 2FA)。 双因素认证 2FA 虽然网络世界和真实世界对于身份的表示不尽相同,但是对于身份认证的手段与经验是可以相互借鉴的。在真实世界,对用户的身份认证基本依据可以分为这三种: 上述三种认证依据被称为三种「因素」(factor)。因素越多,证明力就越强,身份就越可靠。 因此,在网络世界中,为了达到更高的身份认证安全性,某些场景会将上面 3 种挑选 2 种混合使用,即双因素认证。 在支付宝还没有在中华大地普及的时候,去银行通常需要准备一个叫「U 盾」的东西,在使用网上银行时,用户需要先插上 U 盾,然后再输入密码才能登录网上银行。在这一操作中,U 盾(you have)+密码(you know)这两种因素组合在一起就构成了一个双因素认证。 只是后来,随着移动互联网的普及,手机渐渐成为最离不开人身边的物品了,于是传统的「U 盾+密码」的组合方案就被「手机+密码」的组合替代了。 现如今,短信验证码在国内已经成为使用最广泛的两步验证方法之一了,虽然操作方便,不需要安装额外的 APP,但是验证码的下发依赖网络和运营商信号,有被窃听的风险。试想一下,如果这种验证码的获取不需要依赖运营商和网络,哪怕手机处于飞行模式也可以获取验证码,那么安全性是不是就得到提升了? 而这也就是下面将要说的 TOTP,即**“基于时间的一次性密码(Time-based One-time Password)”**。这是目前公认的可靠解决方案,已被纳入国际标准。 TOTP 流程 TOTP 的流程如下: 服务器随机生成一个的密钥,并且把这个密钥保存在数据库中。 服务端将该密钥下发,通常是在页面上显示一个二维码,内容中包含密钥。 客户端扫描二维码,把密钥保存在客户端。 客户端每 30 秒使用密钥和时间戳通过 TOTP 算法生成一个 6 位数字的一次性密码 其实利用 TOTP 验证的流程很简单,这里也只是介绍,如果想深入了解 TOTP 算法的具体实现过程,可以参考 👉TOTP: Time-Based One-Time Password Algorithm 通过这种方式生成一次性验证码,除去第一次获取服务器下发的密钥外,对网络并无其他要求了,这样即使是在离线情况下也可以使用,而且由于由于这种动态生成的密码通常只会存在 30s,安全性也得到了较大的提升。 只是在实际过程中,肯定要额外考虑一些情况,比如如果有人想要暴力破解验证码时,我们可以对验证的错误次数进行限制;抑或是手机端时间和服务器时间不同步,我们需要通过算法的方式兼容服务器时间的前后 30s,从而有效的避免细微时间上差异而导致的验证失败。 使用现状 目前 TOTP 验证 App 主要分为两类:“独占类”和“开放类”。所谓独占类指的是只支持自家账户登录的两步验证,比如 QQ 安全中心、Steam 验证令牌等。开放类则是一个纯粹的两步验证 App,通过一个 App 去作为多个网站的验证器,例如 Google authenticator 就是一个开源的基于 TOTP 原理实现的一个生成一次性密码的工具。...

plainify

互联网是如何工作的?

前言 我们每天都在使用网络,面对这个看不见也摸不着的东西,你有没有思考过他的背后发生了什么吗? 相信很多人第一次接触网络是通过一个叫「网站」的东西,那网站又究竟是什么? 影视剧里经过出现的通过 IP 地址获取定位,是真的可以实现吗? 相信你在阅读本文后就会有一个清晰的认知了。 网站?服务器?网络? 首先我们要理解的是,一个网站只是一堆保存在硬盘上的文件, 就像你的电影、 音乐或图片一样。 然而,网站的唯一的不同之处是: 网站包含一种称为 HTML 的代码。也正是这个叫 HTML 的东西让网站有了好看的皮肤(界面)。 如果你对编程不熟悉,一开始你会很难理解 HTML,因为 HTML 其实是让你的浏览器(Chrome、Safrai、FireFox、IE 等)去**“理解”**的信息,浏览器读得懂这些代码,然后会按照代码的内容展示这些文件。 就和我们对待自己的电脑文件一样,我们会把 HTML 文件存储在硬盘的某个位置, 然后通过浏览器去访问这些 HTML 文件。对于互联网,我们使用特定而功能强大的电脑,我们称之为服务器,所以其实服务器本质上也是一台电脑,它们没有屏幕、鼠标或者键盘,因为它们的主要目的是存储数据,并用它来提供服务。 这就是为什么它们被称作服务器的原因——因为他们用数据服务你。 因此如果想要存储更多的信息,我们有两种解决方案: 增加服务器的容量 增加服务器的数量 显而易见的,一台服务器可以存储的信息是有限的,哪怕是不断增加一台机器的容量也肯定是有上限的。所以,我们可以通过第二种方式以达到**「量变产生质变」**的效果。 于是,一台又一台的服务器通过“网线”连接在了一起,形成了类似下面这样的结构 众多服务器组成的这种结构被称为“互联网”,而其中每台服务器都被称作“节点”,所以「顺着网线来打你」是有理论依据的。 IP 地址?域名? 那么紧接着,问题就来了。 既然网络是用来存储文件的,对于我这个初次上网的人,我又如何找到我想要的内容呢? 不着急,我们先来设想一个场景。 闰土家里有几套房子,其中房子 A 被闰土爸妈当作仓库了,一天,妈妈让闰土去房子 A 拿一个家传的盒子 X,说是给未来儿媳妇准备的,房子 A 在 a 市 b 区 c 小区 d 号,并给了侧门钥匙,让他从侧门 C 进去拿,盒子 X 在房子 A 的 2 楼的房间 B 里的衣柜。...

plainify

科普系列——从网购/直播入手理解什么是CDN

前言 相信很多人在制作自己的第一个网站的时是很激动的。我们知道,在一个网站项目中,页面里经常会有许多 JavaScript 以及 CSS 的引用,如果是直接引用项目内文件的话,他们可能是这样的: 这种方式的优点是开发省力,发布省力,对服务器要求小,省钱,没有具体公网接入需求。 然而如果你的网站里面有很多图片或者视频并且需要部署到公网上时,网站的访问速度一定会让你倍感崩溃。就像下面这张图 👇 这时候肯定会有推荐你使用 CDN 来加速网站里的一些 JavaScript 和 CSS 文件,如下所示: 其实上面的图片就已经使用到 CDN 了。那到底什么是 CDN 呢? 在解释什么是 CDN 之前,我们先来看一个身边非常常见的案例—— 网购。 京东自营与淘宝的购物体验 相信现在应该没有人没用过淘宝和京东的,在说 CDN 之前我们先来说下我在淘宝和京东的购物体验。下面是我在使用这两个电商平台时的情况: 在淘宝买第三方店家商品 在京东购买自营商品 之前我在淘宝买了一个雷电 3 的扩展坞,发货地是深圳,花了三天才到南京,如果收货地是河南呢?新疆呢?我想时间就更长了。可是我在河南的同学在京东(自营)买了一个手机下午购买的第二天早晨就收到货了(并不是给京东打广告)。这是为什么呢? 我们在用京东购物的时候,如果仔细观察的话可以发现,京东自营会根据我们的收货地点,在全国范围内找离我们最近、送达最快的仓库,比如我在南京下的订单,他可能就会从上海甚至直接从南京发货;如果是在洛阳下单可能就会从郑州发货。这样做的好处就是不管我们在南京,还是乌鲁木齐,我们的收货时间会大大减少。CDN 就类似于京东建立的这种仓储系统。 从网购到 CDN 不知道上面的描述是否清楚,这里为了加深理解,我制作了下面的流程对比图: 为了让货物更快的送到买家手中,京东建立了这种仓储系统;类比到网络中,为了让用户更快地加载网页(可以理解为服务器给浏览器送页面),CDN 横空出世了。 CDN 的全称是 Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN 系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上(如下图所示)。其目的是使用户可就近取得所需内容,解决 Internet 网络拥挤的状况,提高用户访问网站的响应速度。 从“直播”理解一些和 CDN 有关的名词 从上面的描述中我们得知了 CDN 的作用以及大概原理,但是其中的细节并没有展开来说。其实 CDN 的一些细节通常会和一些名词联系上,例如负载均衡、源站之类的。同样的,我们以一个身边的例子——“直播”——来讲解这些和 CDN 有关的名词。 我们知道,视频其实是由一帧一帧的图片组成的,所以直播的时候我们收到的视频画面的流程可以近似理解为下面这样 👇 然而事实是这样的吗?当然不是!一个主播怎么可能只有一个观众,所以应该是下面这样 👇...

plainify

科普系列——如何解释什么是 AJAX?

前言 学妹这学期新开了一门课《Script 及 AJAX 开发技术》,然而临近学期末,她突然跑来问我:到底什么是 AJAX ?相信很多人(尤其是前端)在写代码的时候经常会用到 AJAX 技术,但是如果真要说出个所以然,可能还会有些困难。其实简单概括下,AJAX 就是一种利用 JavaScript 向服务端发起请求,并获得服务端响应的技术。它的特点是异步请求,局部刷新。 Tips:这里我将技术二字加粗了,是因为很多初学者会以为 AJAX 是一个库/框架,类似于JQuery/Vue之类的,因而有很多初学者会提出该怎么安装 AJAX 的问题。事实上 AJAX 是一种技术。 虽然概括起来很简单,但是 AJAX 技术的一些细节仍然值得我们思考,接下来我会详细的介绍。 AJAX 解决的问题 我们刚才说过了,AJAX 是一种发送请求的技术,那在 AJAX 被发明前,浏览器是如何请求的呢? 地址栏。用户在地址栏输入 http://baidu.com ,按回车,就向 http://baidu.com 发起了一个请求。(同时页面刷新) a 标签。用户点击页面中的 a 链接,也会发起一个请求。(同时页面刷新) img 标签。页面中如果有 img 标签,那么就会发起一个对此图片的请求(页面没有刷新,但是只能请求图片)类似的还有 link 标签、script 标签,都可以对一类文件的请求。 在这三种方式中,除了第三种,其他两种方式想要发送一个请求,就必须要刷新页面,如果页面只有展示内容的话刷新一下自然无所谓,但倘若一个页面有很多的表单内容需要填写,而你在最后填写完成提交的时候才告诉你,其中某一个地方不符合要求,要你回去重填,然后刷新一下页面,内容都消失了,怕是当时就可能会气的暴走了吧。 也正是这种极端的用户体验让微软创新地开发了一个接口 ActiveXObject(“Microsoft.XMLHTTP”),并在 IE 5.0 中开放给开发者用。通过该接口,浏览器可以向服务器发送请求并取回所需的数据,并在客户端采用 JavaScript 处理来自服务器的回应。这就是 AJAX 的前身。随后这种技术被谷歌的开发人员发现并运用在 Gmail 中,再然后就是 W3C 制定了一个标准用来规范 AJAX,至此 AJAX 算是正式成为每一个前端开发者的必备技能了。 通过 AJAX 技术,服务器和浏览器之间交换的数据大量减少,服务器回应更快了。同时,很多的处理工作可以在发出请求的客户端机器上完成,因此服务端的负荷也减少了许多。 AJAX 的原理 那 AJAX 的实现原理又是什么呢?我们先来看一下 AJAX 的定义,以下内容摘自维基百科:...

plainify

如何向女朋友解释在地址栏中输入网址后发生了什么?

前几天有个学妹问我为什么在浏览器里面输了网址就会显示出来页面,虽然这个现象很常见,但是要想解释清楚确实有些小困难,当时也只是简单的回答了她,现在想趁着这个机会好好整理下相关知识。整理完才觉得其实就和我们去一个地方找人是一个道理。所以说艺术源于生活却又高于生活,技术同样如此。 在回答这个问题前, 我们先来了解下我们平常说的那个网址到底是啥? 网址的学名叫做统一资源定位符(Uniform Resource Locator, 常缩写为URL), 我们知道现在的互联网其实就是由众多资源所构成的一张巨大的网, 如何定位那些资源就是靠的 URL, 因此我们也可以把 URL 理解为是网络上资源的“门牌号“, 我们在浏览器中输入网址, 就相当于开一辆车(浏览器)去找一个地址(URL) 1. 缓存查找 如果你要出门找一个地方, 第一想法肯定是先想这个地方你有没有去过, 你要是去过的话那就不需要问人直接过去就好了。 我们的系统也是这么想的。 当你在浏览器中输入了 URL 之后, 浏览器会先查看 浏览器缓存 中有没有这个地址, 如果没有那就再去 系统缓存, 如果系统缓存还没有, 那就去路由器缓存找, 总之只要缓存中有, 就说明有这个资源, 那浏览器直接显示出来就好了。 Tips: 这里说下 hosts 文件 , hosts 是一个没有扩展名的系统文件, 可以用记事本等工具打开, 其作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联“数据库”, 当用户在浏览器中输入一个需要登录的网址时, 系统会首先自动从 hosts 文件中寻找对应的 IP 地址,一旦找到, 系统会立即打开对应网页, 如果没有找到, 则系统会再将网址提交 DNS 域名解析服务器进行 IP 地址的解析。 需要注意的是, hosts 文件配置的映射是静态的, 如果网络上的计算机更改了请及时更新 IP 地址, 否则将不能访问。 2. DNS 解析 如果你认得去那个地址的路自然是最好, 那如果你根本就没去过那咋办? 肯定会有人说导航, 但并不是所有的地方都是导航能搜到的, 这个时候我们自然而然就会想着去问路人了。 浏览器也是这样的, 如果在本地缓存中没有找到想要的资源, 那就只能去其他网络上的机器中寻找我想要的资源了。 那你怎么知道你要的资源在那台机器上? 这时, DNS 就横空出世了。...

plainify

人人都是 LSP?—— 种子与文件下载的相爱相杀

前言 世界上根本没有 LSP,又或者,人人都是 LSP。 说起种子,你会想到什么? 是农民伯伯春天播下,秋天就会收获果实的东西?还是以.torrent结尾的文件? 如果是前者,那你一定是一个热爱大自然的人。如果是后者,你一定是一个“热爱生活”的人。 不过今天我们要聊的不是大自然的那个种子,而是 LSP 们喜闻乐见的这个种子。 P2P 与 BitTorrent 协议 所谓“种子”(或者叫种子文件),其实就是以.torrent结尾的文件,而他之所以叫种子,是因为这个文件里包含了你需要获取的文件的相关信息。就和自然界中的种子一样,包含了日后形成一颗果实所需要的最基本的成分。 而这个.torrent后缀其实指的是支持 BitTorrent 协议的文件。BitTorrent 简称 BT,俗称比特流。看到这,想必你已经有些印象了吧,我们常说的 BT 种子和种子其实是一种东西。 那么这个 BitTorrent 协议是什么? 不急,在介绍 BitTorrent 之前,先让我们梦回高中课堂,回想一下以前抄作业的时光。 抄作业的例子 如上图所示,学霸在写完作业后,要把作业借给同学抄,但是一次只能借给一个人,且其他人只能抄学霸的作业,那么如果想要让学霸在内的 7 个人都写完作业,取决与学霸写作业的速度和每个同学抄作业的速度。我们知道,这样的效率一定是很低下的,所以聪明的学霸想出了第二个办法。如下图所示: 学霸的办法就是,把作业分成几块,让每个人抄不同的部分,比如 A 抄单选题、B 抄多选题、C 抄填空题……然后每个人再把自己抄到的作业和其他人抄到的作业互换,这样,所有人都可以在规定时间内把所有的作业都抄完了,以此实现效率的提升。 P2P 与文件下载 之所以要先提抄作业这个事情,是因为这两种方案和下载文件颇为相似。 传统的文件下载就和上面的第一种方案类似,如上图所示,客户端向服务器发送“我要下文件”,服务器便将文件再发给客户端,这是一个很常见的场景,在这个场景中,客户端下载文件的速率取决于两个因素:服务器的上传带宽和客户端的下载带宽。带宽是指在单位时间(一般指的是 1 秒钟)内能传输的数据量。 而一旦需要下载的文件数量是多个时,下载的总时间便受到下载数量 N 的限制,即越多的人下载某一个文件时,理论上所需要的下载时间就越长,如下图所示: 这种用户体验显然是很糟糕的,那么有没有什么好的方法解决这个问题呢?这就要请出我们本期的“天降猛男”——P2P**(peer-to-peer)**。 这里的 P2P,和点对点(point-to-point)的协议程序不同,它是用户群对用户群(peer-to-peer),当然也不是我们前几年经常听见的暴雷的 P2P(互联网金融点对点借贷平台)。 本文所说的 P2P 是一种架构模式,就和我们之前说过的 C/S(客户端/服务端)架构类似。 在 P2P 模式中,服务和资源分布化,资源不集中存储在某些设备上,而是分散存储在运行 P2P 程序的设备上,每一个对等方都可以为其他对等方提供服务。 还是拿抄作业这个例子来说,学霸的第二个方案就是一个很典型的 P2P 模式。他将自己的作业分成填空、选择、单选、多选等部分,然后分别送给 6 个人,这样当每个人都有自己的一部分副本后,就可以不用再找学霸本人要作业了,直接找其他拥有和自己副本不同的人索取然后互换资源即可。...