二维码使用广泛,生活处处都有二维码的使用场景。
就拿我前几天遇到的事情来说一说,那天我去骑共享单车出门,发现单车的二维码上面贴着别的二维码(不是,打广告也不能这样打吧 -_- …),用我在生活中遇到的一个小小的案例来引出主题,可见,二维码现在已经被使用的非常广泛了。所以一种东西的使用量到达一定程度之后,好不好用已经不是人们唯一关心的问题了,安全问题是现在用户越来越重视的!
所以二维码的安全性到底有没有保障呢, 有朋友会问了,我扫了你的码,你会不会把我银行卡密码给 “搞” 走了? 这问题提的非常的好啊,接下来,我们就一起来分析一下,二维码背后的原理和实现,就能轻松的得到这个问题的答案啦。Let’s Go!
二维码其实就是一种认证方式,比如我们电脑登录微信,就需要我们用手机扫描电脑二维码,扫描后手机微信就会弹出一个登录确认窗口,询问我们是否确认登录。
你有没有思考过,为什么毫无相干的两个设备,会有如此的联系呢。其实这就是这个二维码发挥的作用了。
这个二维码就是建立起手机和电脑的媒介(中介),抽象地来理解,我们扫描整个二维码识别的过程中,二维码就做了两件事:
好了,那我们应该怎么理解这两句话呢。
就拿我们扫描二维码在电脑登录微信这件事来举例吧。
扫码:
我们 “用手机扫描电脑的二维码” 时,这个时候就是 “向电脑 (向系统) 说明 我是谁 ”。
扫描后,就会出现这个界面,系统已经识别到了我的微信号:
这一步就相当于 “我用手机告诉电脑系统 我是谁” 了。
但是现在手机微信和电脑微信还没建立一个双向的关系,现在手机告诉了电脑 “微信账号”,但是还没授权(认证),所以现在暂时无法登陆。
不理解 授权(认证)意思的朋友,可以把 授权(认证)理解为 “输出密码验证”。也就是刚刚扫码只是验证了 “ 账号 ”,还没验证 “ 密码 ”,所以肯定还无法登陆(还无法建立连接)。
现在就来到了第二步,“如何证明 我 就是 我”,也就是向系统证明我是谁,可以类比于 “输入密码” 的环节。此时电脑微信 “阻塞” 到这个窗口,在等待手机微信授权登陆:
若手机点击 “登录”,则相当于我们给了这个账户的密码,账号密码都对了,那不自然就登录成功了吗。(注意这里只是类比,不是真的传输密码!)
看到这里,小伙伴们对于二维码的登录认证的这个功能已经有了一定的理解了。
那小伙伴们又有疑问了,“我手机确认登录的时候,是不是把我的密码给传过去了,那这样我的密码会不会在传输过程中被劫持了(害怕…)?”,这个问题问的好啊,接下来我们就针对这个问题再解析一波,跟大家一起深入理解一波。往下看。
先回答一下上面的问题,我们需要知道,密码是不会在客户端被获取的,密码在网络中的传播一般不可能是明文传输,所以在安全方面,是有保障的。
二维码能够扫码登录的原理,就是基于 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
(全球唯一)。
我们通过一个序列图来了解整个过程:
注:关注公众号 “啊泽Coding” ,后台回复 “0501” 获取上图源文件。
注意:
这样就完成了整个登录的全流程,不知道坚持看到这里的你会不会有些启发呢。
这个整个登录验证过程在客户端和服务器间形成闭环,可以有效杜绝木马和病毒等危害。
看完前面的解析,已经对微信的扫码登录机制比较清晰了,下面为帮助小伙伴更好的理清里面一些细节,我们再进入深入理解下。
刚刚说了,PC 端与手机端是通过 一个全球唯一的 uuid 绑定的,而且还有过期时间,怎么验证这一说法呢,我们可以打开” 微信网页版 “(https://wx.qq.com/),点开 F12
查看
如果过了 30s 未扫码,界面就会更新二维码的信息,并返回错误码408
408 错误码代表 “请求超时”。
如果我们完成扫码登录,则页面会绑定到我们传输的用户基本信息(头像、昵称等),并显示在页面,同时返回 201
状态码,表示请求成功并且服务器创建了新的资源。(此时二维码已经和手机端的微信建立了绑定关系了)
此时网页正在等待用户在手机确认登录,如果用户确认登录,页面就会返回状态码 200
,表示服务器已经成功处理了请求。
此时用户就登录操作完成。接着就会跳转到网页版微信页面,包含用户信息的 token 字符串也成功传输到了网页版的微信,网页版微信也就完成了整个登录过程了。
二维码在生活中的应用非常广泛,上面所讲的二维码的登录验证场景只是我们常接触的一类应用场景,还有其他很多的场景,比如扫码付款,扫了这个付款码在付款过程会不会造成一些个人敏感信息的泄漏呢,这也是我们可以深入探究的一个问题,安全问题在现在社会越来越得到重视,但是安全漏洞事件还总是频频发生,这也是我们未来需要不断进步的一个方面之一,安全问题有保障了,用户在使用产品的过程中才更有幸福感。
如果这篇文章有帮助到你,别忘了关注点赞在看一键三连哦!
我是啊泽,一枚在 鹅厂 搬砖的实习生,关注我,不断为你分享各种干货,我的经历经验,或许可以给你带来意想不到的帮助,更多干货内容请关注本公众号:“啊泽Coding”,扫描下方二维码关注我吧!