1、二维码应用场景及安全问题
二维码使用广泛,生活处处都有二维码的使用场景。
就拿我前几天遇到的事情来说一说,那天我去骑共享单车出门,发现单车的二维码上面贴着别的二维码(不是,打广告也不能这样打吧 -_- ...),用我在生活中遇到的一个小小的案例来引出主题,可见,二维码现在已经被使用的非常广泛了。所以一种东西的使用量到达一定程度之后,好不好用已经不是人们唯一关心的问题了,安全问题是现在用户越来越重视的!
所以二维码的安全性到底有没有保障呢, 有朋友会问了,我扫了你的码,你会不会把我银行卡密码给 “搞” 走了? 这问题提的非常的好啊,接下来,我们就一起来分析一下,二维码背后的原理和实现,就能轻松的得到这个问题的答案啦。Let's Go!
2、二维码登录的本质
二维码其实就是一种认证方式,比如我们电脑登录微信,就需要我们用手机扫描电脑二维码,扫描后手机微信就会弹出一个登录确认窗口,询问我们是否确认登录。
你有没有思考过,为什么毫无相干的两个设备,会有如此的联系呢。其实这就是这个二维码发挥的作用了。
这个二维码就是建立起手机和电脑的媒介(中介),抽象地来理解,我们扫描整个二维码识别的过程中,二维码就做了两件事:
“我” 是谁 如何证明 “我” 就是我
好了,那我们应该怎么理解这两句话呢。
就拿我们扫描二维码在电脑登录微信这件事来举例吧。
扫码:

我们“ 用手机扫描电脑的二维码 ”时,这个时候就是 “向电脑 (向系统) 说明 我是谁 ”。
扫描后,就会出现这个界面,系统已经识别到了我的微信号:

这一步就相当于 “我用手机告诉电脑系统 我是谁” 了。
但是现在手机微信和电脑微信还没建立一个双向的关系,现在手机告诉了电脑“ 微信账号”,但是还没授权(认证),所以现在暂时无法登陆。
不理解 授权(认证)意思的朋友,可以把 授权(认证)理解为 “ 输出密码验证 ”。也就是刚刚扫码只是验证了“ 账号 ”,还没验证“ 密码 ”,所以肯定还无法登陆(还无法建立连接)。
现在就来到了第二步,“ 如何证明 我 就是 我 ”,也就是向系统证明我是谁,可以类比于 “输入密码” 的环节。此时电脑微信 “阻塞” 到这个窗口,在等待手机微信授权登陆:

若手机点击 “登录”,则相当于我们给了这个账户的密码,账号密码都对了,那不自然就登录成功了吗。(注意这里只是类比,不是真的传输密码!)
看到这里,小伙伴们对于二维码的登录认证的这个功能已经有了一定的理解了。
那小伙伴们又有疑问了,“我手机确认登录的时候,是不是把我的密码给传过去了,那这样我的密码会不会在传输过程中被劫持了(害怕...)?”,这个问题问的好啊,接下来我们就针对这个问题再解析一波,跟大家一起深入理解一波。往下看。
3、二维码验证机制的原理解析
先回答一下上面的问题,我们需要知道,密码是不会在客户端被获取的,密码在网络中的传播一般不可能是明文传输,所以在安全方面,是有保障的。
二维码能够扫码登录的原理,就是基于 token 机制,什么是 token 呢?这个概念暂且放一放,待会再来说。
我们现在先来想象一个场景,比如现在我们去某电商平台买东西,我们购物的流程是 "打开平台 -> 登录账号 -> 点击商品 -> (加入购物车) -> 购买商品",这个过程会跳转到不同的页面完成对应的功能服务。但是在系统实现层面来讲,这里面一般会被拆分为多个微服务模块,比如说登录、购物车、购买页...,一般都是作为不同的模块 “ 去耦合 ” 来提供服务的,但是虽然在不同的模块实现功能,但是这个操作流程对于用户来说是不可感知的,用户只知道“登录 - 加购 - 购买 - 付款...”,所以这些不同模块之间就需要建立起一个链接,将用户信息在不同模块间 “共享”。那这个 “共享” 操作,我直接把用户的信息(包括密码和其他敏感信息)直接明文传输给另一个模块可以吗(比如现在有登录模块 A 与购买模块 B,用户登录后,将 A 模块就已经有了用户信息,A 模块此时把用户信息明文传输给 B 模块),这样是有问题的,如果说有人在模块间把你传输的信息拦截掉了,信息就会被窃取,这就不安全了。
所以现在怎么做的呢?现在使用的是 token 的机制。
token
:token 就是按照一定规则生成的 字符串 ,字符串可以包含用户信息(包括密码等)。
这里说的“ 一定规则 ”,可以自定义,其实可以把它理解为一种加密算法,只要加密算法和解密算法统一即可。举个例子,我们可以使用 JWT 规则。(由 JWT 规则生成的字符串包含三部分信息:(1)jwt 头信息;(2)有效载荷,包含主体信息(用户信息);(3)签名哈希(防伪标志)。jwt 规则生成的 token 字符串是一个很长的字符串,字符之间通过
.
分隔符分为三个子串)
我们从 A 模块,跳转到 B 模块时,用户的信息就以 token 的形式携带过去,B 模块解析这个 token 字符串,就能获取到用户信息(这里就涉及到一套 token 的解析规则了,篇幅原因,这里先暂时不讲),其实就很像一套加密 解密的流程。
那会不会有人有这样的疑惑呢,如果 token 被别人截取了怎么办? 用户信息不是照样泄露了吗?其实 token 只能属于某个客户端私有,其他人或者其他客户端是用不了的。也就是我们在扫了 PC 端的二维码后,手机端不会直接将 token 马上传输给 PC 端,而是中间有经过一步绑定阶段,先将手机端与 PC 端两者绑定起来,再将用户信息生成这个 token 字符串发送给 PC 端,然后 PC 端解析 token 后获取到用户信息,然后就能进行后续操作了。
这里的绑定操作就是通过一个 uuid
(全球唯一)。
我们通过一个序列图来了解整个过程:

注:后台回复“0501”获取上图源文件。
注意:
第 6 步的绑定身份信息不包括密码等信息。只是简单的一些对外的信息,比如头像,昵称等。 上图中还有一些状态信息没画出来,比如 PC 端对二维码的定期更新(二维码有过期时间),如果 PC 端显示的二维码长时间未被扫描,则会出现如下情况:
这样就完成了整个登录的全流程,不知道坚持看到这里的你会不会有些启发呢。
这个整个登录验证过程在客户端和服务器间形成闭环,可以有效杜绝木马和病毒等危害。
4、深入理解二维码在登录的交互过程
看完前面的解析,已经对微信的扫码登录机制比较清晰了,下面为帮助小伙伴更好的理清里面一些细节,我们再进入深入理解下。
刚刚说了,PC 端与手机端是通过 一个全球唯一的 uuid 绑定的,而且还有过期时间,怎么验证这一说法呢,我们可以打开” 微信网页版 “(https://wx.qq.com/),点开 F12查看

如果过了 30s 未扫码,界面就会更新二维码的信息,并返回错误码408

408 错误码代表“ 请求超时 ”。
如果我们完成扫码登录,则页面会绑定到我们传输的用户基本信息(头像、昵称等),并显示在页面,同时返回 201
状态码,表示请求成功并且服务器创建了新的资源。(此时二维码已经和手机端的微信建立了绑定关系了)

200,表示服务器已经成功处理了请求。

此时用户就登录操作完成。接着就会跳转到网页版微信页面,包含用户信息的 token 字符串也成功传输到了网页版的微信,网页版微信也就完成了整个登录过程了。
5、总结感悟
二维码在生活中的应用非常广泛,上面所讲的二维码的登录验证场景只是我们常接触的一类应用场景,还有其他很多的场景,比如扫码付款,扫了这个付款码在付款过程会不会造成一些个人敏感信息的泄漏呢,这也是我们可以深入探究的一个问题,安全问题在现在社会越来越得到重视,但是安全漏洞事件还总是频频发生,这也是我们未来需要不断进步的一个方面之一,安全问题有保障了,用户在使用产品的过程中才更有幸福感。
如果这篇文章有帮助到你,别忘了关注点赞在看一键三连哦!
我是啊泽,关注我,不断为你分享各种干货,更多干货内容请关注本公众号:“啊泽 Coding”,扫描下方二维码关注我吧!






