常见的认证方式
认证机制是一种用户确定用户身份或者权限的安全措施,比如用来验证某个用户是否有权限访问一个资源,如果认证通过,用户就可以成功访问,反之则会访问失败
常见的认证方式有四种,分别是 Basic、Digest、OAuth 和 Bearer
Basic
Basic Auth,也称为 HTTP 基本认证,是最简单的认证方式
Basic 认证步骤:
客户端在发送请求时,简单的把 用户名:密码
进行 base64 编码,包含在 HTTP Authorization Header 字段中发送给服务器
服务器收到请求后,解析出 Authorization 字段中的 base64 字符串,通过解码获取用户名和密码。拿着用户名和密码去数据库里比较,如果匹配到就认证通过
Authorization 是请求标头中专门存放用户身份依据的字段,后面的 Digest、OAuth 和 Bearer 认证方式都会用到这个字段
详细了解:Authorization - HTTP | MDN (mozilla.org)
通过 base64 编码,可以将密码以非明文的方式传输,增加一些安全性。但是 base64 只是一种编码方式,而不是加密方式。任何人在拦截 HTTP 请求的情况下可以轻松地解码并获取用户名和密码
即使把密码加密之后再通过 base64 编码,入侵者仍然可以通过加密后的密码进行重放攻击
因此,Basic 认证方式不适合用于传输敏感信息或者在不安全的网络中使用,除非配合 SSL/TLS 来确保传输层的安全
Digest
Digest Auth(摘要认证)是另一种 HTTP 认证协议,它兼容了 Basic 认证方式,也修复了 Basic 的严重缺陷,提供了更安全的方式进行验证
摘要认证采用质询/响应的方式。整体过程简单来说就是,一开始客户端先向服务端请求认证要求,接着使用服务端响应回的质询码计算生成响应码。最后携带响应码再次请求服务端进行认证
Digest 认证步骤:
整体步骤分为三步:
1、客户端请求服务端,服务端不知道客户端是否真的知道密码,请求失败,返回 401 Unauthorized
,并返回 WWW-Authenticate
字段,该字段中包含认证所需要的信息:
WWW-Authenticate
必须包含 realm
和 nonce
这两个字段。其中 nonce 字段是每一次返回 401 响应时生成的任意随机字符串,该字符串通常由base64 编码的十六进制数组成(实际内容依赖服务器的具体实现)
2、客户端根据WWW-Authenticate
中的信息,选择加密算法,结合随机数 nonce,计算出响应码 response。最后带着响应码再次请求服务端
3、服务器将客户端提供的响应码与服务器内部计算出的结果进行对比。如果匹配,就说明客户端知道密码,认证通过,并返回一些与授权会话相关的附加信息,放在 Authorization-Info
中
摘要认证可以避免密码以明文方式发送,并且可以防止重放攻击
因为服务端向客户端发送的密码随机数 nonce 每次请求都会变化,客户端计算出的响应码会随着 nonce 的变化而变化,入侵者拿着上一次请求携带的响应码去请求服务端肯定会失败,而且想要根据服务端响应回的 nonce 计算出正确的响应码,就必须知道密码
摘要认证可以保护密码,比基本认证安全很多。但摘要认证并不能保护内容
如果入侵者截获了客户端和服务端的所有通讯,就有可能可能推测出密码;摘要认证没有对通信双方进行验证,不能防止用户伪装
OAuth
OAuth(开放授权)是一种开放标准,用于授权用户在客户端应用程序或网站上访问受保护资源的操作流程
OAuth 允许用户在无需提供用户名和密码的情况下授权第三方应用程序访问其受保护的资源。这种授权机制使得用户可以控制自己的数据,并选择允许哪些应用程序访问其数据
OAuth 目前的版本是 2.0,一共有四种授权方式:
-
授权码模式(authorization code)
-
简化模式(implicit)
-
密码模式(resource owner password credentials)
-
客户端模式(client credentials)
再详细介绍各个模式之前,需要先了解几个专有名词
来看一个例子,现在要根据微信账号登录百度
点击下方的微信图标后,会跳转到网页要求扫码,用手机扫码后,会询问是否同意百度申请微信账号的昵称、头像信息
点击允许后,页面重定向到登录完成页面,完成使用微信账号登录百度
在这整个流程中,有几个关键角色
-
第三方应用程序,又称客户端(client),即例子中的“百度”
-
HTTP 服务提供者,简称“服务提供商”,即例子中的“微信”
-
资源所有者,又称“用户”
-
用户代理,即例子中的浏览器(通过浏览器打开百度登录的页面)
-
授权服务器,服务提供商专门用来处理认证授权的服务器
-
资源服务器,服务提供商存放用户资源的服务器,它与认证服务器可以是同一台服务器,也可以不是同一台
授权码模式
授权码模式是功能最完整、流程最严密的授权模式,也是目前最常用的模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动
还是根据上面的例子来详细说明每一个步骤
步骤:
1、用户通过代理(浏览器)访问客户端
用户通过浏览器打开百度登录页面,点击微信图标,使用微信账号登录百度
2、客户端将用户导向授权服务器
这一步是客户端调用服务提供商提供的授权接口
调用接口时有几个重要参数:
-
client_id(图中为appid,这可能是微信平台自定义的参数,如果选用QQ或者微博登录,携带的参数是client_id,效果是一样的),客户端ID,这是百度在微信的授权服务器中注册得到的,必选项
-
response_type,授权类型,使用授权码模式时固定填 code,必选项
-
scope,申请的权限范围,可选项
-
redirect_uri,重定向URI,用于授权成功后跳转,可选项
-
state,表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值,通过这个参数可以防止 csrf 攻击
3、授权服务器询问用户是否给予客户端授权
用微信扫码后,可以选择是否同意百度申请微信账号的昵称、头像信息
4、用户同意授权后,授权服务器将用户导向客户端指定的“重定向URI”,并附上授权码
5、客户端收到授权码,使用授权码向授权服务器申请令牌
6、授权服务器核对授权码,向客户端发送令牌
7、客户端通过令牌向资源服务器请求资源
后面几步是在客户端的后端实现的,对用户不可见,最后能看到的结果就是成功用微信账号登录了百度
授权码模式通过前端传送授权码,后端存储令牌,与资源的通信都在后端,可以避免令牌的泄露导致的安全问题
简化模式
简化模式和授权码模式很类似,只不过不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了“授权码”这个步骤
简化模式中所有步骤都在浏览器中完成,令牌对用户是可见的,且客户端不需要认证
认证步骤:
1、用户通过代理(浏览器)访问客户端
2、客户端将用户导向授权服务器
3、授权服务器询问用户是否给予客户端授权
4、用户同意授权后,授权服务器向客户端发送令牌
5、客户端通过令牌向资源服务器请求资源
简化模式适用于没有后台程序的单页面应用,存在着“中间人攻击”的风险,安全性不高
密码模式
密码模式中,用户直接把用户名和密码告诉第三方应用,第三方应用使用用户名和密码去向服务提供商索要授权,获取令牌
认证步骤:
1、客户端向用户发出获取用户名和密码的请求
2、用户同意后,客户端凭借用户名和密码向服务提供商换取令牌
3、服务提供商验证用户身份后,给出客户端令牌
4、客户端凭借令牌访问资源服务器请求资源
密码式的授权方式中用户必须提供密码,通常用于用户高度信任某应用的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品
客户端模式
客户端模式中,客户端应用程序直接与授权服务器进行通信,不涉及用户的参与
严格来说,客户端模式并不属于 OAuth 要解决的问题,在这种模式中,用户直接向客户端注册,客户端使用自己的客户端表示(client ID)和客户端密钥(client secret)向服务提供商申请令牌,其实不存在用户的授权问题
认证步骤:
1、客户端向认证服务器进行身份验证,并要求一个访问令牌
2、认证服务器确认无误后,向客户端提供令牌
3、客户端通过令牌访问资源
客户端模式不涉及用户的操作和授权交互,适用于一些没有前端的命令行应用
Bearer
Bearer 认证,也称为令牌认证,是一种 HTTP 身份验证方法。Bearer 认证的核心是 bearer token
bearer 是一个加密字符串,通常由服务端根据密钥生成,客户端在请求服务端时,必须在请求头中包含 Authorization: Bearer <token>
服务端收到请求后,解析出 token
并验证合理性,如果校验通过,则认证通过
和基本认证 Basic 一样,Bearer 也需要配合 HTTPS 使用,用来保证安全性
当前最常用的 token 编码方式是 JWT(JSON Web Token)
JWT 由 JSON 数据格式组成,通过 HASH 散列算法生成一个字符串,该字符串可以用来进行授权和信息交换
使用 JWT Token 进行认证具体可以分为四步:
1、客户端使用用户名和密码请求登录
2、服务端收到登录请求后验证用户名和密码,如果通过验证,就签发一个 token 返回给客户端
3、客户端把收到的 token 存放在 cookie 或 LocalStorage 等地方存储,之后客户端的每次请求都会携带该 token
4、服务端再次收到请求后(不一定是登录请求),会解析请求中的 token,解析成功则进行对应的业务逻辑
JWT 由三部分组成,分别是 Header、Payload 和 Signature,它们之间用圆点.
连接,例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJpYW0uYXBpLm1hcm1vdGVkdS5jb20iLCJleHAiOjE2NDI4NTY2MzcsImlkZW50aXR5IjoiYWRtaW4iLCJpc3MiOiJpYW0tYXBpc2VydmVyIiwib3JpZ19pYXQiOjE2MzUwODA2MzcsInN1YiI6ImFkbWluIn0.Shw27RKENE_2MVBq7-c8OmgYdF92UmdwS8xE-Fts2FM
JWT 中,每部分包含的信息为:
分别来看:
Header
Header 中包含两部分信息,分别是 token 的类型和所用的加密算法
例如:
{"typ": "JWT","alg": "HS256"}
typ 说明 token 的类型是 JWT,alg 说明加密算法是 HS256,alg算法可以有多种
把这段 JSON 数据进行 base64 编码,就得到了 Header
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
在某些场景下,可能还会有 kid 选项,用来标识一个密钥ID,例如:
{"alg": "HS256","kid": "XhbY3aCrfjdYcP1OFJRu9xcno8JzSbUIvGE2","typ": "JWT"}
Payload
Payload 中携带 token 的具体内容由三部分组成:JWT标准中注册的声明(可选)、公共的声明、私有的声明
JWT 标准中注册的声明部分,有以下标准字段:
例如:
{"aud": "iam.authz.marmotedu.com","exp": 1604158987,"iat": 1604151787,"iss": "iamctl","nbf": 1604151787}
进行 base64 编码后,得到
eyJhdWQiOiJpYW0uYXV0aHoubWFybW90ZWR1LmNvbSIsImV4cCI6MTYwNDE1ODk4NywiaWF0IjoxNjA0MTUxNzg3LCJpc3MiOiJpYW1jdGwiLCJuYmYiOjE2MDQxNTE3ODd9
除此之外,还有公共的声明和私有的声明。公共的声明可以添加任何的需要的信息,一般添加用户的相关信息或其他业务需要的信息,注意不要添加敏感信息
私有声明是客户端和服务端所共同定义的声明,因为base64是对称解密的,所以一般不建议存放敏感信息
Signature
Signature 是 token 的签名部分,把 Header 和 Payload 分别 base64 编码后,用.
连接,然后再使用 Header 声明的加密方式,利用 secretKey(密钥)对连接后的字符串进行加密,就得到了 Signature
secretKey 保存在服务器中,一般通过配置文件保存,例如
jwt:key: dfVp0K8LZeJLZHYmHdb1VdyRrACKpqoo #服务端密钥timeout: 24h # token过期时间(小时)max-refresh: 24h # token 更新时间(小时)
密钥一定不能泄露,密钥泄露后,入侵者可以使用该密钥来签发 JWT Token,从而入侵系统
最后生成的 Token 如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJpYW0uYXV0aHoubWFybW90ZWR1LmNvbSIsImV4cCI6MTYwNDE1ODk4NywiaWF0IjoxNjA0MTUxNzg3LCJpc3MiOiJpYW1jdGwiLCJuYmYiOjE2MDQxNTE3ODd9.LjxrK9DuAwAzUD8-9v43NzWBN7HXsSLfebw92DKd1JQ
签发的 token 会在客户端以后的请求中携带,服务端收到 token 后,先解析出 Header 和 Payload,然后使用 Header 中声明的加密算法对 header.payload 进行加密,得到 Signature,拿着这个 Signature 与收到的 token 中的 Signature 对比,如果相同则验证通过,不相同则解析 token 失败,返回对应的错误信息
最后,不要存敏感信息(密码等)在 token 中
总结
在开发应用程序时,需要认证机制来保证应用的安全。认证就是用来验证某个用户是否有执行某种功能的权限,如查询、创建、修改等操作
目前常用的有四种常用的认证方式:Basic、Digest、OAuth、Bearer。其中 Basic 和 Bearer 用得最多
而不管是 Basic 认证还是 Bearer 认证,都需要结合HTTPS来使用,来最大程度地保证请求的安全性
参考资料:
理解OAuth 2.0 - 阮一峰的网络日志 (ruanyifeng.com)
《图解HTTP (上野宣)》
相关文章:

常见的认证方式
认证机制是一种用户确定用户身份或者权限的安全措施,比如用来验证某个用户是否有权限访问一个资源,如果认证通过,用户就可以成功访问,反之则会访问失败 常见的认证方式有四种,分别是 Basic、Digest、OAuth 和 Bearer …...

DolphinScheduler部署安装or基础介绍(一)
DolphinScheduler概述 Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用 DolphinScheduler核心架构 DolphinScheduler的主要角色如下: Ma…...

Failed building wheel for pyaudio Running setup.py clean for pyaudio
从错误信息来看,问题出在 pyaudio 包的构建过程中。具体来说,缺少 portaudio.h 头文件,这通常是因为系统上没有安装 portaudio 库。 以下是解决此问题的步骤: 安装系统依赖: 在大多数基于 Debian 的系统(如…...

【ARMv8/v9 GIC- 700 系列 1 -- Programmers model for GIC-700】
请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC-700 Programmers model寄存器实现和访问模式接口宽度和数据格式访问类型安全寄存器访问地址映射和页面GIC-700 Register map pagesSummaryGIC-700 Programmers model GIC-700是ARM的一种通用中断控制器,它遵循GICv3和GICv4架构…...

exel带单位求和,统计元素个数
如果exel表格中,如果数据有单位,无法直接用 自动求和 直接求和。如下图所示,求和结果为0,显然不是我们想要的。 用下面的公式求和,单位不是“个”的时候记得替换单位。统计范围不是“C1:C7”也记得换一下啊!…...

JavaScript里方括号[]的使用
我们知道可用方括号来表示数组或者JSON对象的属性值,其实在特定场合,方括号还有妙用的。 比如我有数据源是一组JSON,其中有一个属性是时间字符串,我想对时间的小时、星期、日、月分别进行处理。每条JSON都各自生成一条新的JSON&am…...

俯卧撑计数器(Python)
通过 MediaPipe 检测人体姿态,计算俯卧撑角度和计数,并在图像上进行可视化展示 需要有cv2库和mediapipe库 mediapipe库: MediaPipe是Google开源的机器学习框架,用于构建实时音频、视频和多媒体处理应用程序。它提供了一组预训练的…...

UVA12342 Tax Calculator 题解
题目传送门 题目大意 题目描述 某国所得税计算十分复杂。该国政府指定你制作一个自动计算所得税的程序。以下是该国计算所得税的规则: 所得税免征额为 180000 180000 180000 元。应纳税额中不超过 300000 300000 300000 元的所得额,按 10 % 10\% …...

WebKit中Websockets的全面支持:实现高效实时通信
WebKit中Websockets的全面支持:实现高效实时通信 Websockets是一种网络通信协议,它允许在单个TCP连接上进行全双工通信,从而实现服务器与客户端之间的实时数据交换。WebKit作为许多流行浏览器的底层引擎,对Websockets提供了全面的…...

微信小程序的智慧物流平台-计算机毕业设计源码49796
目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3研究方法 1.4开发技术 1.4.1 微信开发者工具 1.4.2 Node.JS框架 1.4.3 MySQL数据库 1.5论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 用户登录流程 2.2.2 数据删除流程 2.3 系统功能分…...

旅游 | 西岳华山
得到了再失去, 总比从来没有得到更伤人。 ——胡赛尼《追风筝的人》 目录 旅游 | 西岳华山00 | 旅游导图01 | 旅游路线1.1 北上西下(徒步)1.2 北上西下(索道)1.3 西上北下(索道)1.4 西上西下&am…...

如何优化Java中的内存占用?
如何优化Java中的内存占用? 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 理解Java内存管理机制 Java的内存管理主要由JVM负责,开发人员在编写代码时需要注意如何有效地…...

2024这三家上海闵行装修公司,值得一看
在繁华的上海闵行区,随着居民对生活品质追求的提升,越来越多人开始重视居住环境的打造。然而,面对众多装修公司的选择,不少消费者往往感到迷茫和困惑。今天,我们就来揭晓闵行区口碑与实力兼备的三家装修公司。 1、首先…...

K8S学习教程(三):在PetaExpress KubeSphere 容器部署 Wiki 系统 wiki.js 并启用中文全文检索
背景 wiki.js 是非常优秀的开源 Wiki 系统,尽管在与 xwiki 功能相比 ,还不算完善,但也在不断进步。 常用的功能还是比较实用的,如:Wiki 写 作、分享、权限管理功能还是非常实用的,UI 设计非常的漂亮&#x…...

服务器该如何抵御CC攻击
CC攻击也是分布式拒绝服务攻击的一种类型,同时CC攻击也属于网络流量攻击,但是CC攻击主要是用来攻击网站页面的,向着目标网络服务器发送一些请求,以此来消耗目标网络服务器的资源,导致目标服务器无法响应正常请求&#…...

关于centos7自带的nginx1.20.1开启https后,XP系统的IE6和IE8无法显示网页的问题
CentOS7自带的nginx-1.20.1是支持HTTP/2和TLS1.3的。 软件包名称:nginx-1.20.1-10.el7.x86_64 CentOS7默认开启了HTTP/2,但没有开启TLS1.3,以及IE6和IE8的https访问。 开启方法: ssl_ciphers HIGH:!aNULL:!MD5;改为ssl_ciphers…...

Zotero软件翻译插件Translate for Zotero的API接入方法--百度垂直领域翻译
首先注册通用文本翻译API的token:百度翻译开放平台 (baidu.com)(可以免费认证 升级为高级版) 之后点击管理控制台,选择总览右侧最下方可以看到个人的id和密码 点击文档与支持, 在这里可以选择领域。 支持传入值描述支持语言方向…...

python实现接口自动化
代码实现自动化相关理论 代码编写脚本和工具实现脚本区别是啥? 代码: 优点:代码灵活方便缺点:学习成本高 工具: 优点:易上手缺点:灵活度低,有局限性。 总结: 功能脚本:工…...

如何提问 如何回答
如何提问 如何回答 如何提出一个好问题 1、选择合适的平台或专家:选择合适的论坛,或者能够给你答案的地方或者人 2、清晰描述问题背景:描述问题的背景,清楚明确地表达你的问题以及需求,不需要加过多的语气助词&#…...

计算机图形学入门26:高级光线传播
1.有偏与无偏 在做光线追踪很多方法都是用蒙特卡洛积分去估计,蒙特卡洛积分有些是无偏的(Unbiased),所谓无偏估计就是无论使用多少个样品,所估计的期望值都是正确的。那么,所有其他情况都是有偏的(Biased),就是估计的期…...

STM32蓝牙HID实战:打造低功耗、高性能的客制化键盘
一、项目概述 本项目旨在使用STM32单片机打造一款功能强大的蓝牙客制化键盘,它拥有以下特点: 九键布局,小巧便携: 满足日常使用需求,方便携带。全键可编程: 所有按键和旋钮均可通过电脑软件自定义快捷键,实现个性化功…...

C++ STL容器:序列式容器-队queue,deque
摘要: CC STL(Standard Template Library,标准模板库)在C编程中的重要性不容忽视,STL提供了一系列容器、迭代器、算法和函数对象,这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …...

简谈设计模式之单例模式
上一篇博客已经介绍了设计模式及其设计原则, 在这篇博客中笔者会介绍一下单例模式, 也是最简单的一种设计模式 单例模式 单例模式属于创建型模式. 它涉及到一个单一的类, 该类负责创建自己的对象, 同时确保只有单个对象被创建, 这个类提供了一种访问其唯一对象的方式, 可以直…...

在Spring Boot中实现多线程任务调度
在Spring Boot中实现多线程任务调度 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. Spring Boot中的任务调度 Spring Boot通过集成Spring框架的Task Execution和Scheduling支持,提供…...

dify/api/models/account.py文件中的数据表
源码位置:dify\api\models\account.py accounts 表结构 字段英文名数据类型字段中文名字备注idStringUUIDIDnameString名称emailString邮箱passwordString密码password_saltString密码盐avatarString头像interface_languageString界面语言interface_themeString界…...

SQLAlchemy迁移数据库
SQLAlchemy迁移数据库 目录 SQLAlchemy迁移数据库安装Alembic配置Alembic编辑 alembic.ini编辑env.py生成迁移文件建表语句示例修改迁移文件命名格式 安装Alembic pip install alembic配置Alembic 执行初始化后会创建一个 alembic 目录,包含Alembic的配置文件 ale…...

Django文档简化版——Django快速入门——创建一个基本的投票应用程序
Django快速入门——创建一个基本的投票应用程序 准备工作1、创建虚拟环境2、安装django 1、请求和响应(1)创建项目(2)用于开发的简易服务器(3)创建投票应用(4)编写第一个视图1、编写…...

安全防御第三天(笔记持续更新)
1.接口类型以及作用 接口 --- 物理接口 三层口 --- 可以配置IP地址的接口 二层口 普通二层口 接口对 --- “透明网线” --- 可以将一个或者两个接口配置成为接口对,则 数据从一个接口进,将不需要查看MAC地址表,直接从另一个接口出;…...

【12321骚扰电话举报受理中心-短信验证安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

杂项——循迹模块调节方法
1-4 路灰度传感器的调节方法: 调节时探头应对着颜色较浅的上方(如果是黑白线赛道则应该将探头 对着白色上方调),轻轻的将全部可调电阻顺时针拧到底,再逆时针 慢慢回旋,直到对应探头的信号指示灯亮起后&…...