c++ - 如何设置 ZMQ PUB/SUB 模式以仅服务于预授权订阅者

标签 c++ c c++11 zeromq pyzmq

我如何在 PUB-SUB 模式中实现或进行某种“破解”以获得仅向授权订阅者发布内容,断开未授权订阅者等的能力?

我用谷歌搜索了这个问题,但所有答案都与在订阅者端设置订阅过滤器非常相似。

但正如我所说,我只想将我从 PUB 的更新发布给那些通过授权或拥有一些 secret key 的客户>,在 REQ-REP 中收到。

感谢您的任何想法。

最佳答案

Read Chapter 5 of The Guide ,特别是名为“Pub-Sub 的优点和缺点”的部分。

在您尝试完成它的方式中,您尝试完成的事情存在很多问题(但如果您愿意更改架构,则有解决方案)。

  • 大概您需要 PUB 套接字可供全世界普遍访问,无论是整个世界还是仅由一些经过授权的套接字和一些未经授权的套接字组成的世界。 如果没有,您可以将对 PUB 套接字本身的访问(通过防火墙)控制为仅授权机器/套接字。
  • 当 PUB 套接字接收到一个新连接时,它不知道订阅者是否被授权。 PUB 无法接收来自 SUB 套接字的实际通信,因此 SUB 套接字无法直接传达其授权。 XPUB/XSUB 套接字打破了这个限制,但它对你没有帮助(见下文)。
  • 无论您如何将 SUB 套接字的授权传递给 PUB 套接字,我都不知道有什么方法 PUB 套接字可以终止或忽略未经授权的 SUB 套接字连接。 这意味着不受信任的 SUB 套接字可以订阅 ALL ('') 并从 PUB 套接字接收所有消息,而 PUB 套接字对此无能为力。 如果信任 SUB 套接字来监管自己(您创建连接套接字并控制它部署的机器),然后您可以选择订阅“控制”主题,发送授权,并拥有PUB 套接字反馈您可以订阅的 channel /主题。

因此,这几乎无法在可公开访问的 PUB/SUB 范例中实现一般安全性。

以下是您的选择:

  1. 放弃 PUB/SUB - 在发送方(据我所知),您可以准确控制每次发送给哪个对等点的唯一方法是使用 ROUTER 套接字。如果你使用 ROUTER/DEALER,DEALER socket 可以发送它的授权,ROUTER socket 将其与它的 ID 一起存储,当需要发送某些东西时,它只是找到所有连接的已授权的 sockets 并按顺序发送给每个他们中的。这是否可行取决于套接字的数量和工作负载(消息的大小和数量)。
  2. 加密您的消息 - 您已经说过这是最后的手段,但这可能是唯一可行的答案。正如我上面所说,任何可以访问您的 PUB 套接字的 SUB 套接字都可以订阅所有 ('') 正在发送的消息,而不会受到监督。您无法有效地隐藏您的 PUB 套接字地址/端口,您无法隐藏通过该 PUB 套接字发送的任何消息,但您可以通过加密隐藏这些消息的内容。 key 共享的正确方法取决于您的情况。

关于c++ - 如何设置 ZMQ PUB/SUB 模式以仅服务于预授权订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30784640/

相关文章:

c++ - glReadPixels 无效使用成员(你忘记了 '&' 了吗?)

c - 32bit架构下各种指针大小的面试题

c++ - g++ 7.1.1 中的可变参数模板部分特化 "not more specialised"

c++ - 嵌套的 openMP 并行化结合 std::thread

c# - C++ ULONG 定义到 VB.NET 或 C# 等价物?

c++ - 无法弄清楚为什么没有在 SDL 中绘制线

c++ - 生成不重复的随机字符串的正确方法是什么

c - 如何连接到 socket (c)?

c - 如何在没有 MSYS2 的情况下在 Windows 上构建 GTK+3 程序?

c++ - 使用模板基类消除工厂类派生类冗余的简洁方法