这是SitePoint的IoT周! 我们整周都在发布有关互联网与物理世界交汇点的文章,因此请继续检查IoT标签以获取最新更新。
物联网安全是当今世界的紧迫问题:与互联网连接的设备数量超过了人,并且过去几年共享的数据量激增。 但是,保持数据安全同样迅速成为一个问题,尤其是在对健康敏感的设备以及易受危害的设备(例如车辆)出现之后!
我不能声称拥有所有答案,但是我确实有一个技巧可以帮助您寻求安全性-JSON Web令牌,我也将其称为JWT。 这些小巧,可移植,可验证的令牌有助于确保您从设备和服务器发送和接收的通信均来自受信任的来源。 它们还可以作为出色的载体和访问令牌。
什么是JSON Web令牌?
对于以前从未接触过这些的人,JSON Web令牌是基于JSON的令牌,用于在网络上发送经过验证的信息。 它们在发送之前经过base64编码,因此它们通常看起来像这样:
![带有JSON Web令牌的jwt.io调试器](https://i-blog.csdnimg.cn/blog_migrate/9246b15d907c5f8e9894c995c072c6ac.png)
显示JSON Web令牌的jwt.io调试器
上面您所看到的是JWT.io上的JWT调试器,在该站点上您可以学到更多有关JWT的知识,而不是我们在本文中有余地的地方。 左侧是已编码的完整JWT。 这包括:
- 标头以base64编码,并与“。”连接。
- 使用base64编码的有效负载,带有另一个“。”。
- 签名密钥
右边是解码的标头和有效负载。 它们由声明组成(这只是JSON键值对的奇特名称) 。 标准声明了一些声明- "alg"
"sub"
代表密钥的签名算法, "sub"
代表订户。 您提出的其他声明,例如"admin"
。
密钥包含标头的签名哈希,并与"."
连接"."
,然后是所有base64编码的有效负载。 它由双方共同持有的秘密签名,可以是对称的(字符串)或不对称的(RSA公钥/私钥对)。
这些声明共同描述了令牌本身以及您想要保留的其他任何内容,例如用户信息和相关的会话数据。 只需确保将数据限制在外-JWT的一大好处就是,如果您不过度使用它们,它们将很小!
通过将JWT放置在Authorization HTTP标头中,格式为:
Authorization: bearer <token>
如果您无法修改HTTP标头,则许多服务还将JWT作为主体参数,甚至是查询参数。 如果可以使用HTTP标头,则不建议使用这些方法。
JWT的好处是什么?
物联网世界是小型设备的世界,开发人员努力使这些设备的HTTP调用尽可能地小。 JWT通过很少的开销来解决此问题。 他们使用简约的JSON方案和base64编码来实现此目的。 只要确保您自己添加的声明不太多,否则使用它们会覆盖大小的好处! 将要求降到最低,以保持您的应用正常运行。
为什么不使用cookie? 这也满足了HTTP请求的需求。 从一开始,它就位于JWT内,而不是服务器必须使用cookie来查找有关用户会话的其他信息。 这意味着无需进行额外的数据库或外部服务调用。 同样,这取决于您如何使用它们,因此请仔细考虑您需要什么主张,哪些不需要。
JWT的另一个好处是它们是通用的—几乎每个平台都存在JSON解析器,并且访问base64编码/解码以及hsa256签名和验证的能力变得越来越重要。 此外,JWT还具有Web标准的支持,因此您可以确信自己所使用的技术可以轻松地与其他符合Web标准的服务集成,包括许多OAuth2提供程序和OpenID Connect标准的所有提供程序。
即使您的IoT设备无法解码令牌,也可以将其作为服务器和服务的访问令牌移交给设备。 只要您的设备可以存储给它的字符串,JWT便可以被您的物联网设备用作存储的凭证。 只需确保确保这些令牌并密切注意它们,否则不记名令牌会很危险!
当今网络体系结构的众多挑战之一就是要验证分散在多个域中的服务,即使是单个爱好者或公司也可能在不同的PaaS提供商上运行服务! JWT使跨域协商变得更加容易-只要各方共享同一秘密来验证密钥,JWT就不会在乎域,子域,端口等。
加密呢?
当我解释JWT时,我听到的第一件事就是“数据已编码,但是我需要对其进行加密,否则我的数据就在那里供所有人查看!” 不用担心-有RFC 7517处理的JSON Web加密,它使您可以加密JSON Web令牌,并且仍然参与标准合规性! 甚至还有很多支持它的库。 我也看到了它的名字叫JOSE(Javascript对象签名和加密)。
在物联网架构中使用JWT
现在,我们进入了很好的部分-方法。 我们将从您的IoT设备以及您的IoT服务器的角度进行研究。
在物联网设备上使用JWT
如果您只是想接收一个JWT作为承载令牌,而不使用所包含的信息,那么您要做的就是将您从服务器接收到的JWT存储在设备上,并随每个经过身份验证的请求一起发送。
如果您想使用有效负载,或者让设备自行发布JWT,则您的设备必须具备以下能力:
- JSON解析/字符串化
- base64编码/解码
- HS256签名验证
它还将需要存储服务器将用于签名/验证JWT的共享密钥。
收到令牌后,请按照以下步骤操作:
- 使用存储在设备上的密钥验证密钥的签名。
- 如果签名有效,请使用base64解码获取字符串化的JSON有效负载。
- 将有效负载解析为一个对象。
在那里,您拥有了! 对于Arduino爱好者,这里有一些库用于base64编码/解码,HS256验证和JSON对象处理。 对于运行Linux的Raspberry Pi之类的平台,您可以使用许多不同的脚本语言(Python,Ruby,Node.js)来处理JWT, JWT.io网站概述了一些可供使用的SDK。
在物联网服务器上使用JWT
正如我在设备部分提到的那样,您可以使用JWT.io网站上提到的SDK来控制如何在服务器上处理JWT验证。
例如,如果您使用Node.js和Express,则可以使用express-jwt
中间件,该中间件将阻止用户或设备在未经JWT验证的情况下访问路由。
现在我们已经涵盖了在实践中使用JWT的内容,下面我们来讨论在物联网架构中使用JWT时要记住的一些经验法则。
有关JWT的一些一般建议
这些是我在一段时间内使用JWT所学到的一点点学习知识,其中有些是常识。 但是在您的体系结构中实现JWT时要牢记它们是很好的。
始终验证签名
当您的服务器收到带有令牌的请求时,请始终验证该签名,否则首先您将失去使用JWT的主要价值-知道发送者就是他们所说的!
使用(并强制执行)到期字段
在标准中, iat
字段是令牌发行的时间,而exp
字段是令牌到期的时间戳。 强烈建议您使用并强制执行这两个字段,尤其是当您具有敏感信息时。 这样,最终如果令牌确实消失了,它将失效。
id
字段如何非常方便
等待泄露的令牌过期是一回事,但是能够主动吊销令牌也很有帮助。 JTI(JSON令牌ID)声明可以帮助您解决此问题-您可以撤消对特定ID的访问权限,而不必立即更改机密和吊销所有令牌! 只需确保您的JTI与其他GUID一样具有高度的抗碰撞性即可。
结论
感谢您的支持,并了解如何使用JSON Web令牌保护IoT设备!
From: https://www.sitepoint.com/securing-your-iot-devices-and-services-with-json-web-tokens/