乐趣区

关于物联网:通过用户名密码认证保障-MQTT-接入安全

认证是一种安全措施,用于辨认用户并验证他们是否有权拜访零碎或服务器。它可能爱护零碎免受未经受权的拜访,确保只有通过验证的用户能力应用零碎。

物联网连贯万物,对试图拜访基础设施的用户进行认证至关重要。未经受权的拜访存在重大的安全隐患,必须加以防备。因而,物联网开发者应该全面理解各类认证办法。

在本文中,咱们将探讨 MQTT 中的认证机制,以及其能够解决什么平安危险,并介绍一种罕用的认证形式:基于明码的认证。

MQTT 中的认证

在 MQTT 中,认证是在连贯建设时对客户端或者服务端的身份进行验证的过程。它仅波及是否有权限连贯到 Broker,与受权不同,后者决定客户端能够公布和订阅哪些主题。咱们将在本系列之后的文章中对受权进行具体解说。

  • 基于明码的认证:Broker 查看客户端是否具备正确的连贯凭据,包含用户名、客户端 ID 和明码。Broker 能够依据明码验证用户名或客户端 ID。
  • 加强认证:引入了反对质询 - 响应机制的认证框架,能够反对 SCRAM、Kerberos 等多种认证机制。
  • 其余:如基于令牌的身份验证(例如 JWT)等。

本文中咱们将重点介绍基于明码的认证形式。

基于明码的认证

基于明码的认证是一种通过测验连贯方是否领有正确的明码凭据来确认连贯方身份的办法。

在 MQTT 中,基于明码的认证通常应用用户名和明码作为凭据,但在某些非凡场景下,有些客户端可能无奈提供用户名,因而客户端 ID 也能够作为惟一标识来代表身份。

当 MQTT 客户端与 Broker 建设连贯时,它会在 CONNECT 报文中携带 用户名 明码。上面的示例展现了用 Wireshark 工具抓取的客户端 CONNECT 报文,其中 Client ID 为 client1,用户名为 user,明码为 MySecretPassword。

Broker 从 CONNECT 报文中提取用户名(或客户端 ID)和明码后,须要在相应的数据库中查问该用户名对应的凭据,而后与客户端发送的明码进行比拟。如果数据库中不存在该用户名,或者明码与数据库中的凭据不统一,Broker 将回绝客户端的连贯申请。

下图展现了 Broker 如何应用 PostgreSQL 来验证客户端的用户名和明码。

基于明码的认证能够确保只有领有正确凭据(即用户名和明码)的客户端能力连贯到 Broker。然而,正如在 Wireshark 抓包过程中所见,如果有人可能黑进通信通道,他们就能够轻松地截取数据包并获取连贯凭据,因为它们都以明文模式发送。对于这个问题,咱们将在本系列的后续文章中解说如何应用 TLS(平安传输层协定)进行解决。

应用 Salt 和 Hash 爱护你的明码

以明文形式存储明码是一种危险的做法,因为这将导致明码容易被窃取。如果攻击者取得了明码数据库或密码文件的拜访权,他们就能够轻松地读取并应用明码对系统进行非法拜访。为了避免这种状况产生,明码应该在存储之前通过哈希和 Salt 加密。

哈希是一个函数,接管输出数据,对数据进行数学运算,而后生成一个与原始输出数据齐全无关的哈希值。这样做的目标是为了混同原始输出数据。这个函数应该是不可逆的,确保不能依据输入还原输出。然而,哈希值自身并不平安,可能会受到字典攻打,如下例所示。

sha256 hash: 8f0e2f76e22b43e2855189877e7dc1e1e7d98c226c95db247cd1d547928334a9

加密后的明码看起来很平安,通过观察你无奈揣测出明码是什么。然而,对于一个固定的明码,哈希值总是雷同的。因而,很容易制作一个蕴含罕用明码及其哈希值的数据库。如下表:

黑客就能够从在线哈希数据库中搜寻这个哈希值,从而失去明码 passw0rd

在明码中退出 Salt 能够解决这个问题。Salt 是一串随机的字符,在哈希运算之前被附加到明码中。这使得即便明码雷同,退出 Salt 后它们的哈希值也会不一样。Salt 与明码的哈希值一起存储在数据库中,当用户登录时,将 Salt 拼接到他们的明码中,而后将生成的哈希值与存储在数据库中的哈希值进行比拟。如果哈希值雷同,用户就被容许拜访。

在执行哈希函数之前,在明码中插入一串随机的字符串,这个随机字符串就是 Salt。

例如,Salt 为 az34ty1,sha256(passw0rdaz34ty1) 为:6be5b74fa9a7bd0c496867919f3bb93406e21b0f7e1dab64c038769ef578419d

这个哈希值很难在哈希数据库中匹配,因为要想匹配该值,哈希数据库须要为明码 passw0rd 增加海量的条目。

基于明码的认证办法在 MQTT 中的最佳实际

通过上文的介绍,咱们将 MQTT 中基于明码的认证办法最佳实际总结如下:

  • 在 MQTT 中进行基于明码的认证,最重要的一点是要抉择简单和独特的明码。容易被破解或在多个账户中重复使用的明码会危害整个 MQTT 零碎的平安。
  • 平安地存储和传输明码以避免它们被歹意窃取也十分重要。例如,明码应在存储前进行 Hash 和 Salt 加密,并通过 TLS 等平安通道进行传输。
  • 此外,为了缩小明码的裸露,不要在代码或配置文件中硬编码明码,而是应该应用环境变量或其余平安存储机制。

结语

总而言之,基于明码的认证在爱护 MQTT 连贯和物联网零碎的完整性方面起着关键作用。通过遵循明码抉择、存储和传输的最佳实际,同时留神暴力攻打等常见问题,物联网开发者能够无效实现 MQTT 零碎的平安保障。作为一个宽泛应用的可扩大、高可用的 MQTT Broker,EMQX 也提供了包含基于明码认证在内的一系列安全措施,以保障用户的物联网零碎的平安。

基于明码认证只是 MQTT 泛滥认证形式中的一种,且并不一定适宜每个应用场景。数字证书或 OAuth 2.0 等更高级的办法可能会在某些状况下提供更强的安全性。物联网开发者须要理解和把握各类罕用的认证形式并抉择最适宜的一种或多种。

在本系列的下一篇文章中,咱们将介绍另一种认证形式:加强认证。敬请关注。

版权申明:本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/securing-mqtt-with-username-and-password-authentication

退出移动版