深入解析 MQTT 中基于 Token 的认证和 OAuth 2.0

news2024/9/24 9:26:06

除了前几篇文章中提到的认证方法,本文将对其他认证方法进行深入分析和探讨。

具体而言,我们将深入了解基于 Token 的认证和 OAuth 2.0,阐述它们的原理并展示它们在 MQTT 中的应用。

基于 Token 的认证

让我们先来认识一下基于 Token 的认证,了解它相较于传统的用户名和密码认证的一些优势。

什么是基于 Token 的认证?

简单来说,基于 Token 的认证使用 Token 来验证客户端身份,而不是使用传统的凭据(如用户名和密码)。这个过程类似于使用电子门卡进入酒店房间。当您向前台出示身份证时,他们会提供一张电子门卡,让您能够打开酒店房门。这张电子门卡在您入住期间起到了 Token 的作用,您无需每次进入房间时都向前台证明身份,只需刷卡即可。

Token 的一个重要特性是其具备有效期限制,可以在到期后失效。例如,您的酒店门卡在退房后将失效。然而,您可能会入住另一家酒店并拿到新房间的门卡。因此,相较于用户名和密码,Token 更加灵活且易于管理。酒店房门上的电子门卡阅读器无需记录有效的用户名和密码,只需验证门卡上的房间号码和有效期即可。

下面我们将深入研究一些适用于 MQTT 的基于 Token 的认证方法。

基于 Token 的 MQTT 认证方法

在 MQTT 中,我们通常使用 JWT 来实现令牌认证。

JWT(JSON Web Token)是一种在 MQTT Broker 中验证客户端身份的简洁方式。客户端向 Broker 发送一个签名的 JWT Token,Broker 根据该 Token 验证客户端身份。Broker 不需要保存客户端的用户名和密码。

JWT Token 由以下部分组成:

  • 头部:用 Base64 编码 - 说明生成签名所采用的算法。
  • 有效载荷:用 Base64 编码 - 携带可以验证客户端身份的声明。
  • 签名:将头部和有效载荷连接后用 Base64 编码,再用密钥对其签名。

下图显示了 JWT 的结构:

 JWT 的结构

请注意,头部和有效载荷并没有加密,它们只是用 base64 二进制到文本编码函数进行了编码。这是一个可逆的函数,所以只要用 base64 解码函数就能轻松地看到内容。因此,不要在头部和有效载荷部分放置敏感信息。另外,最好使用 TLS 对客户端连接进行加密。JWT 使用 密钥 进行签名。

Broker 需要验证 JWT 是否有效。这可以通过两种方式实现:一种是在本地持有密钥,可以是一个和客户端共享的密钥,也可以是一个与签发 JWT 使用的私钥相对的公钥;另一种是使用 JWKS (JSON Web Key Set),JWKS 是一组公钥,可以用来检验密钥是否有效。Broker 可以通过 JWKS 端点来获取公钥,而无需自己持有它。

JWT Token 在颁发后,就无法撤销,只能等到它过期。因此,一定要把它保存在安全的地方,如果落入他人之手,攻击者就可以利用它来访问 Broker。

可以通过使用认证服务器来获取 JWT Token。在这种情况下,客户端先连接到认证服务器,认证服务器核实其身份后,向客户端发放 JWT Token。客户端凭借这个令牌来连接 Broker。

下图展示了这个过程:

Token-Based Authentication Method for MQTT

下面是一个 JWT 有效载荷的例子。

{
 "clientid": "client1",
 "username": "user1",
 "iat": 1516239022,
 "nbf": 1678114325,
 "exp": 1709649185
}

除了 clientidusername 字段外,JWT 令牌还可以包含一些时间字段,用于表示令牌的有效期。这些时间字段以 Unix 时间的形式表示,即从 1970 年 1 月 1 日开始计算的秒数。

  • “iat”:颁发时间 - Token 颁发的日期和时间。用 Unix 时间表示。
  • “nbf”:生效时间 - Token 开始生效的日期和时间。用 Unix 时间表示。
  • “exp”:过期时间 - Token 失效的日期和时间。用 Unix 时间表示。

请注意,通过使用 nbf 字段,您可以颁发一个在未来某个日期才生效的 JWT。

OAuth 2.0

在上一节中,我们介绍了 JWT Token 的格式,但是并没有说明如何获取 Token。接下来,让我们看看如何将 OAuth 2.0 和 JWT 结合使用,以使客户能够访问 Broker。

什么是 OAuth 2.0?

OAuth 2.0 是一个框架,它让用户可以用他们在一个独立的认证和授权服务器(如 Google、Facebook、GitHub 等)注册的凭证来访问其他网站或应用的资源。这样,用户就不需要为每个网站或应用设置不同的密码,实现了单点登录(SSO)的效果。用户可以在不同的应用程序中使用相同的 Google 凭证。

最初,OAuth 2.0 被设计为一种授权框架,用于授予第三方应用程序对特定资源的有限访问权限。一个常见的例子是对 Gmail 联系人的只读权限。我们可以允许应用程序读取我们的联系人,但不希望它能够删除它们。OAuth 2.0 解决的一个问题是,它允许我们让第三方应用程序访问我们的联系人,而无需将我们的 Gmail 密码提供给该应用程序,从而提升了安全性。

为了方便使用 OAuth 2.0 协议进行认证,一个名为 OpenID Connect 的 OAuth 2.0 扩展应运而生。该扩展定义了使用 OAuth 2.0 进行认证的标准方法。考虑到认证是本文的主题,我们将 OAuth 2.0 和 OpenID Connect 结合起来使用,共同实现 MQTT 客户端访问 Broker 的授权机制。

OAuth 2.0 如何与 MQTT 配合?

客户端可以利用 OAuth 2.0 和 OpenID Connect 来获取合适的 JWT,然后再将 JWT 发送给 Broker。参考上面的图片,第一步是 MQTT 客户端向认证服务器申请 JWT Token。我们这里假设认证服务器支持带有 OpenID Connect 扩展的 OAuth 2.0。OpenID Connect 规定了认证服务器返回的令牌必须是 JWT 格式。客户端拿到 JWT 后,就可以把它发送给 Broker。通常,JWT 放在 CONNECT 报文的密码字段里发送给 Broker。

结语

作为全球领先的 MQTT Broker,EMQX 提供了多种认证方式,其中包括 JWT 认证。您可以选择 HMAC 作为签名方案,也可以选择更安全的 RSA,或者直接为 EMQX 配置一个 JWKS 端点来启用 JWT 认证。

通过使用这些额外的认证方式,您可以增强整个系统对未授权访问和潜在安全威胁的防护。随着技术的不断进步,与最新的认证技术保持同步将变得更加重要。

版权声明: 本文为 EMQ 原创,转载请注明出处。
原文链接:https://www.emqx.com/zh/blog/a-deep-dive-into-token-based-authentication-and-oauth-2-0-in-mqtt

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网站窗口标题旁的图标生成与替换

电脑端浏览器打开网站后窗口顶部的标签标题左边会有一个网站图标的显示,那个图标需要的是 .ico 格式的文件 在线免费生成ico图标的网址 只需要打开网址选择文件、选择尺寸生成下载,然后放到个人项目中(一般放在public目录中)&am…

IDEA中右侧栏和底部栏不见了

IDEA中右侧栏和底部栏不见了 在开发中,IDEA的右侧栏目maven、database等栏目不见了 右侧栏中和底部没东西。 问题解决: View—>Appearance–>Tool Windows Bars 选中即可。 选中之后,出现

mac安装Golang开发环境及快速入门

目录 一、Mac brew 安装go环境 1.1 安装步骤 1.2 设置GOPATH 及环境变量 1.3 编写第一个go程序 二、快速入门 1.1 快速入门需求 1.2 go学习(自用) 一、Mac brew 安装go环境 1.1 安装步骤 1)终端输入,也可以指定下载go版本…

黑客(信息安全网络安全)自学手册

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 行为:从编程开始掌握,前端后端、通信协议、什么都学。 缺点:花费时间太长、实际向安全过渡后可用到的关键知识并不多。…

uniapp自定义头部,计算状态栏和导航栏高度超简单三步

效果图 1.pages.json 页面给要自定义头部的页面加入一行代码 "navigationStyle":"custom" {"path": "pages/index/index","style": {"navigationBarTitleText": "","navigationStyle":"…

代码随香录day16

104. 二叉树的最大深度 思路:这道题推荐用层序遍历递归的方式 递归三要素: 终止条件:当当前node为空时候 单层递归逻辑:分别向node的左子树和右子树进行递归,定义left和right接受返回值 递归参数:root 代…

wincc与300以太网通讯教程在建材行业矿粉磨生产自动化控制系统中应用

内容摘要 上位机与S7-300PLC通信采用以太网通信,通讯模块采用捷米特ETH-S7300-JM01以太网通讯模块,捷米特ETH-S7300-JM01通讯模块直接插到CPU315-2DP的DP口上。 项目介绍 立磨PLC控制系统: 立磨是一种理想的大型粉磨设备,广泛应…

最详细的下载安装PicGo图床配合Typora使用

1.node.js下载安装1.2 检验安装成功 2. PicGo下载安装3. 配置Gitee【配合PicGo使用】3.1 获取PicGo的token 4. 配置PicGo4.1 下载插件4.2 配置图床[Gitee]4.3 配置Typora 5. 上传图片到Gitee【重要】6.解决配置错误 1.node.js下载安装 【node.js下载链接】点击跳转页面&#x…

安卓JNI从0到1入门教程(三)

前面两篇博客介绍了jni相关内容,以及怎么在Android中简单使用,demo比较简单。这次来讲讲复杂一点的java和C/C的互相调用。 下面我们将要实现的功能是将Java对象传递给C,然后用C的对象接收值,最后把C对象的值回传给Java层。 一、…

HP Laser 136nw打印机与win10实现Wifi直连

HP Laser 136nw打印机与win10实现Wifi直连 HP Laser 136nw打印机设置HP Smart HP Laser 136nw打印机设置 打开打印机WIFI开关,使其他设备可以搜索到 查看打印机设备名称,用于设备搜索 查看打印机WIFI密钥,用于windows与打印机直连 根据…

深度学习开源框架

文章目录 1. 深度学习框架1.1 概述1.2 深度学习框架—关于组件1.2.1 组件—张量1.2.2 基于张量的各种操作1.2.3 计算图1.2.4 自动微分工具1.2.5 拓展包 2. 主流深度学习框架2.1 市面上主流框架2.2 本土深度学习框架2.3 深度学习框架的标准化--ONNX 3. Tensorflow3.1 Tensorflow…

【读书笔记】《认知驱动》- 周岭 - 2021年出版

不停的阅读,然后形成自己的知识体系。 2023.07. 读 读完毛姆的《月亮与六便士》,本来打算阅读《人类群星闪耀时》。尝试阅读了一下,有点太累了,于是换周岭老师的另一本《认知驱动》来读吧,这本书稍显轻快好理解一些&a…

JavaScript的数据类型和数据类型的检测

目录 数据类型 数据类型的检测 🎁更多干货 完整版文档下载方式: 数据类型 JavaScript的基础数据类型有,NaN string undefined Null Boolen Symbol   Bigint 这些都是基础数据类型,还有一个引用数据类型&…

2. CSS3的新特性

2.1CSS3的现状 ●新增的CSS3特性有兼容性问题, ie9才支持 ●移动端支持优于PC端 ●不断改进中 ●应用相对广泛 ●现阶段主要学习: 新增选择器和盒子模型以及其他特性 CSS3给我们新增了选择器,可以更加便捷,更加自由的选择目标元素: 1.属性选择器 2.结构伪类选择器…

中介者(Mediator)模式

目录 动机使用场景参与者协作效果实现相关模式应用和思考 中介者(Mediator)是对象行为模式,用一个中介对象来封装一系列对象的交互。中介者使各对象不需要显式的相互应用,从而使其耦合松散,而且可以独立的改变他们之间的交互 动机 面向对象设…

光学卷积处理芯片---自动驾驶高性能运算平台的福音?

摘要: 本文提到的在低损耗氮化硅平台上制造的紧凑片上光学卷积处理单元,可以展示出其大规模集成的能力。 深度学习的处理模式是我们在在自动驾驶环境目标分类、识别、跟踪等场合下不可或缺的重要一环。随着自动驾驶技术的不断演进,要求处理的…

怎么学习核心Java相关的技术和知识? - 易智编译EaseEditing

学习核心Java相关的技术和知识可以按照以下步骤进行: 学习Java基础: 从Java语言的基础知识开始学习,了解语法、数据类型、运算符、控制流程等基本概念。 可以通过在线教程、书籍或学习资源进行自学,如Oracle官方的Java教程、Ja…

funbox2靶场笔记

信息收集开放21,22,80端口 21端口存在ftp匿名访问,下载压缩包,有密码,直接破解 ftp简单命令 ftp ip anonymous#匿名用户 ls cd pwd lpwd get pwd mget 使用工具fcrackzip fcrackzip -D -u -p rockyou.txt tom.zip -D 使用字典 rockyou字…

反射的基础部分知识

反射的基础——Class Java当中的类用来表示具有相同属性和方法的对象的集合,是抽象的概念。对象是类创建的,同一个类的不同对象具有不同的属性值。 Java当中定义的所有类都属于同一类事物,可以Class来表示。 类型 访问方法 返回值类型 说…

MySQL数据库管理(二)

文章目录 一.表结构(增加字段)1.创建表结构2.复制数据表2.1 复制格式2.2 克隆表 3.清空表,删除表内的所有数据4.创建临时表 二.MySQL中6种常见的约束1.外键的定义2.创建外键约束作用3.创建主表blue4.创建从表Icecream5.为主表blue添加一个主键约束。主键名建议以&qu…