文章目录

  • 1、二维码应用场景及安全问题
  • 2、二维码登录的本质
  • 3、二维码验证机制的原理解析
  • 4、深入理解二维码在登录的交互过程
  • 5、总结感悟

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(全球唯一)。

我们通过一个序列图来了解整个过程:

注:关注公众号 “啊泽Coding” ,后台回复 “0501” 获取上图源文件。

注意:

  • 第 6 步的绑定身份信息不包括密码等信息。只是简单的一些对外的信息,比如头像,昵称等。
  • 上图中还有一些状态信息没画出来,比如 PC 端对二维码的定期更新(二维码有过期时间),如果 PC 端显示的二维码长时间未被扫描,则会出现如下情况:

这样就完成了整个登录的全流程,不知道坚持看到这里的你会不会有些启发呢。

这个整个登录验证过程在客户端和服务器间形成闭环,可以有效杜绝木马和病毒等危害。

4、深入理解二维码在登录的交互过程

看完前面的解析,已经对微信的扫码登录机制比较清晰了,下面为帮助小伙伴更好的理清里面一些细节,我们再进入深入理解下。

刚刚说了,PC 端与手机端是通过 一个全球唯一的 uuid 绑定的,而且还有过期时间,怎么验证这一说法呢,我们可以打开” 微信网页版 “(https://wx.qq.com/),点开 F12查看

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

408 错误码代表 “请求超时”。

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

此时网页正在等待用户在手机确认登录,如果用户确认登录,页面就会返回状态码 200,表示服务器已经成功处理了请求。

此时用户就登录操作完成。接着就会跳转到网页版微信页面,包含用户信息的 token 字符串也成功传输到了网页版的微信,网页版微信也就完成了整个登录过程了。

5、总结感悟

二维码在生活中的应用非常广泛,上面所讲的二维码的登录验证场景只是我们常接触的一类应用场景,还有其他很多的场景,比如扫码付款,扫了这个付款码在付款过程会不会造成一些个人敏感信息的泄漏呢,这也是我们可以深入探究的一个问题,安全问题在现在社会越来越得到重视,但是安全漏洞事件还总是频频发生,这也是我们未来需要不断进步的一个方面之一,安全问题有保障了,用户在使用产品的过程中才更有幸福感。

如果这篇文章有帮助到你,别忘了关注点赞在看一键三连哦!
我是啊泽,一枚在 鹅厂 搬砖的实习生,关注我,不断为你分享各种干货,我的经历经验,或许可以给你带来意想不到的帮助,更多干货内容请关注本公众号:“啊泽Coding”,扫描下方二维码关注我吧!

深入理解微信二维码扫码登录的原理相关推荐

  1. 重磅!微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力

    点击上方"CVer",选择加"星标"置顶 重磅干货,第一时间送达 本文转载自:OpenCV团队 2011年12月微信3.5版本正式上线"扫一扫&quo ...

  2. thinkphp5+php微信公众号二维码扫码关注推广二维码事件实现

    thinkphp5微信公众号二维码扫码关注推广二维码事件实现, 给出实现的全部方法: 获取二维码,让微信公众号跳转到以下代码的code方法即可,用户点击二维码后,通过二维码获取关注用户信息及二维码推广 ...

  3. 应用宝ysdk微信二维码扫码登录没有回调问题

    在更新ysdk版本的时候,发现新版本ysdk增加了微信二维码扫码登录,但是打包测试发现并没有登录回调. 接下来就开始排查了,检查了生命周期都没有问题,那问题出现在哪里呢?用ysdk提供的demo换上我 ...

  4. 微信二维码扫一扫的实现

    使用java实现微信二维码扫一扫功能,基本步骤如下: 1.打开MyEclipse 2.创建一个WebProject 3 .添加二维码jar包,使用的jar包常用的是QRcode.jar 4.编写代码: ...

  5. 微信二维码支付支付宝二维码支付(主扫模式)开发指南

    微信二维码支付 熟悉微信支付全家桶的童鞋应该都清楚,微信支付是没有提供PC网关支付的,那么传统的网站需要怎么接入微信支付产品呢? 我们可以选择微信支付中的Native支付产品,官方介绍: Native ...

  6. 微信公众平台开发(三)——微信二维码生成扫码关注

    微信二维码生成是指后端发送请求向微信服务器申请公众号的二维码,用户如果未关注,进行扫描改二维码后即跳转道公众号的关注页面:如果已经关注,扫描二维码后直接进入该微信公众号.当用户扫码时,微信服务器会向后 ...

  7. js调用微信利用二维码扫码登录

    js调用微信利用二维码扫码登录 准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统. 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐 ...

  8. MyCnCart 专业版之个人微信二维码扫码转账

    个人微信二维码扫码转账支付方式,适合于国内外没有公司实体申请正常的微信支付渠道接口,但又想通过微信转账进行收款的国内个人商户或国外个人或公司商户. 后台配置: [扩展功能]->[支付方式]-&g ...

  9. 对于微信二维码相关官方文档的一些注解(微信登录和绑定微信、关注公众号)

    转载自:https://www.jianshu.com/p/d533c69be034 由于微信官方文档对此的描述虽然还可以,但是还是有一些让人疑惑的地方,所以笔者做了一些注解,希望对大家有所帮助 为什 ...

最新文章

  1. 机器学习必知必会10大算法
  2. 一文让你完全弄懂回归问题、激活函数、梯度下降和神经元模型实战《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)
  3. [专栏目录]-ATF/FF-A/specification学习 -- ongoing
  4. VS 中配置使用Visual SVN系列 四:SVN Server配置和使用
  5. 计算机学校专业工学,大学专业详解:工学(仪器仪表类)
  6. FastDFS 安装
  7. JavaScript正在完善—解释
  8. linux线程能删除自身吗,Linux内核本身和进程的区别 内核线程、用户进程、用户...
  9. 【FFmpeg小点记】AV_DISPOSITION_ATTACHED_PIC
  10. Flask入门(三)~补充及虚拟环境
  11. 网络爬虫中Json数据的解析[以时光网为例]
  12. 重磅推出:2019中国开源年度报告
  13. 卧槽!微信又更新了新功能,快来尝鲜!!
  14. Python程序使用os.system()方法调用exe程序导致主程序进程无响应
  15. vbo,ibo,vao
  16. dmp格式怎么转换_如何生成转储(dmp)文件--工具篇
  17. python怎么统计多少字符_python统计中文字符数量的两种方法
  18. 数据中台之数据建模三部曲
  19. 网络传输介质 通信中的有线介质:双绞线、同轴电缆、光纤 引导性传输介质
  20. 哈佛研究:9个让你变穷的理由

热门文章

  1. 全球与中国网络连接视频门铃对讲机市场深度研究分析报告
  2. 「技术架构」技术风险管理权威指南
  3. 计算机101页报告翻译,冯诺伊曼 101页报告 First Draft of a Report on the EDVAC
  4. 什么是802.11ac和802.11ac Wave2
  5. 802.11ax分析1---IEEE 802.11ax和IEEE 802.11ac性能对比
  6. 瀑布模型原型模型迭代模型螺旋模型的适用场景
  7. 公安部:河南特大套路贷受害人超95%为在校大学生
  8. 面向对象程序设计实验——编写Rational类
  9. Web中间件常见安全漏洞
  10. 全员全域安全守护,蔚来ET7获Euro NCAP五星安全评级背后的硬核实力