深入理解微信二维码扫码登录的原理

文章目录

    • 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”,扫描下方二维码关注我吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/72563.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv调用微信的二维码识别引擎

导读 用过二维码识别的小伙伴们都知道,微信的二维码识别确实要比开源的二维码识别zxing和zbar要强不少,zxing和zbar对小的二维码以及模糊的二维码基本上是识别不出来的,有时候一张包含二维码的图片可能你缩放一下就可能导致识别不出来&#…

微信扫码登陆(1)---扫码登录流程讲解、获取授权登陆二维码

扫码登录流程讲解、获取授权登陆二维码 具体流程可以看微信官网的扫码登录文档 地址:准备工作 | 微信开放文档 其实官方文档已经讲的非常清楚而且讲的也很明白。 一、扫码登录流程讲解 1、首先准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAut…

生成微信二维码,微信扫码登录网站

注意 微信扫码登录,有两种实现方式: 方式1、依赖公司在【微信开放平台】用【公司营业执照】注册的账号,才能实现扫码登录 方式2、借助个人或者公司的微信公众号,生成微信带参二维码,实现扫码关注公众号后登录 大家要明…

安科瑞AWT100无线数据采集通信终端

安科瑞AWT100无线数据采集通信终端 安科瑞 崔丽洁

佳信客服全渠道接入手册

包括网页、微信、app、微博、邮箱、字节小程序等几种常见渠道接入配置,今天手把手教你如何配置。 网页渠道插入配置和使用 企业可以通过在web网站或微官网植入网页插件代码,让您的客户可以通过web网站和微官网的“联系客服”按钮,与企业客服…

NC与单一窗口数据对接丨外贸软件

在国际贸易通关过程中,所涉及相关部门的信息管理,主要是以数字化流程系统为主,让每个部门业务的申请、办理、回复采用电子化和互联网化。由于每个环节部分的数据壁垒未打通,数据无法协同共享,导致在口岸通关的过程中&a…

小满OKKICRM和畅捷通T+接口打通对接实战

数据源平台:小满OKKICRM 小满科技一直以“人工智能大数据”为核心驱动力,并融入多年深耕CRM行业的经验,为外贸客户提供多场景的解决方案。凭借卓越的服务水准,小满科技先后斩获“年度最佳外贸SaaS服务商”、“2019杰出品牌形象奖”、“2020最…

最新码支付源码+微信/支付宝/qq/秒挂支付/uid+三网监控+易支付H5接口 +聚合免签系统

(码支付不支持虚拟主机)强烈建议使用:[服务器](标准版、系统选Centos、其他配置默认即可后续可升级配置),刚入门选择最低配置或者活动机器均可。服务器环境要求的配置:PHP 7.3 Mysql 5.7 Sup…

vagrant下的虚拟机与windows主机通信,vagrant可以接受数据,主机ping一下显示请求超时,此时应该更换ip地址的最后一位,可能是ip地址冲突的原因,而不是防火墙是否的原因。

vagrant下的虚拟机与windows主机通信,vagrant可以接受数据,主机ping一下显示请求超时,此时应该更换ip地址的最后一位,可能是ip地址冲突的原因,而不是防火墙是否的原因。

网吧电脑显示连不上服务器,Pubwin客户机连不上服务器怎么办?

前面小编分享过文章《pubwin2009客户机的配置方法》,下面小编说说客户机使用过程中常见的一个问题:pubwin2009客户机连接不上服务器?遇到这种问题该如何解决呢。 pubwin2009客户机连接不上服务器,主要是因为控制台列表中&#xff…

虚拟机CentOS7网络Ping不通问题

目录 1、情境复现 2、查看路由信息 3、尝试重启网络服务 4、按照提示查看网络服务状态 5、检查ifcfg-ens33配置是否正确 6、检查VM虚拟网络编辑器子网IP是否正确 7、引入Network与NetworkManage的概念 8、查看NetworkManage状态 9、关闭NetworkManage及开机自启 10、…

ChatGLM服务器部署微调(一)

项目下载 下载地址:https://github.com/THUDM/ChatGLM-6B/tree/main 远程环境搭建以及配置 因为我是在服务器上运行,所以先搭建一下远程环境,如果不知道的话,可以看我之前这篇博客 详细完整pycharm远程连接服务器,…

【历史上的今天】12 月 9 日:微软推出 Windows 2.0;五十年前的极客科技展;第一个获得专利的人

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2021 年 12 月 9 日,在 1968 年的今天,Douglas Engelbart 在一场重要会议上(正文将会介绍)演示了世界上的第一个鼠标&am…

【历史上的今天】10 月 26 日:NetBSD 系统发布;Windows 8 诞生;微软推出 Surface 系列

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2022 年 10 月 26 日,历史上的今天,英国足协在伦敦成立,制定了第一个足球规则,宣告了现代足球运动的诞生;足…

校验密码复杂度(规则:长度8-30,必须包含数字、字母、特殊符号)、校验用户名(规则:长度4-19,包含数字、字母,不包含特殊字符)

校验密码复杂度(规则:长度8-30,必须包含数字、字母、特殊符号) 校验用户名(规则:长度4-19,包含数字、字母,不包含特殊字符)

密码长度至少6位,包括任意字符

页面标签 < asp:RegularExpressionValidator ID "revPassword" ControlToValidate "txtPassword" Display "Dynamic" ValidationExpression "([\s\S]{6,})" runat "server" ErrorMessage "密码长度至少6位" &…

在26个字符大小写和9个数字组成的列表中随机生成10个长度为8密码。

import random lst[] #建一个空列表 print(ord(a)) #拿到a的数字编码 97 print(ord(z)) #拿到z的数字编码 122 print(ord(A)) #拿到A的数字编码 65 print(ord(Z)) #拿到Z的数字编码 90 for i in ran…

新闻稿怎么写?

首先咱们要熟记新闻稿的六大要素和三要点&#xff1a; 新闻 六要素&#xff1a; 1、时间 2、地点 3、人物 4、事件 5、经过 6、结果 新闻稿怎么写 简单来说呢&#xff0c;就是咱们在在XXX时间,XXX地点&#xff0c;XXX人物&#xff0c;举办了XXX活动或者说做了什么事&#xff0c…

#A. gzx 的数学题

只要a b的结果不是 1&#xff0c;那答案就是 1&#xff0c;否则答案就是2。 注意数据范围&#xff0c;需要使用 long long #include <bits/stdc.h> #define int long long using namespace std; int a,b; signed main() {scanf("%lld%lld",&a,&b);if…

2016年全国高中数学联赛加试T2解答

2016年全国高中数学联赛加试T2解答 加试T2为平面几何。   题意如图&#xff0c; O 1 &#xff0c; O 2 O_1&#xff0c;O_2 O1​&#xff0c;O2​分别为三角形 X A C , Y A B XAC,YAB XAC,YAB外心。 B X A C C Y A B BX \times AC CY \times AB BXACCYAB&#xff0c;求证…