使用 OMEMO 加密在 XMPP MultiUserChat 中向未知用户发送消息

Posted

技术标签:

【中文标题】使用 OMEMO 加密在 XMPP MultiUserChat 中向未知用户发送消息【英文标题】:Sending messages to unknown users in XMPP MultiUserChat with OMEMO encryption 【发布时间】:2018-02-27 09:06:02 【问题描述】:

我正在尝试使用 OMEMO 加密构建一个 MUC 平台,以便在 android 应用上使用。我正在使用 Ejabberd (v17.11) 和 Smack 库 (v4.2.1)。

MUC 房间 persistentallow_subscription 用于 Muc/Sub 支持,用于离线消息。

当客户作为“所有者”开始新房间并从他的名册中添加“成员”时;所有的客户都加入了房间,一切看起来都很好。 所有者可以向群组发送消息,并将消息传递给每个成员。

但是当一个群组成员尝试发送消息时,如果他不'知道'群组的所有成员(如果他们不在他的名册中),他就无法发送消息!

我发现,在向群发OMEMO消息时,需要为每个成员单独加密消息,这就需要得到每个成员的devicelist

在这一步:

mOmemoManager.encrypt(muc, msgBody);

它尝试为所有收件人加密,但获取未知用户的设备列表会导致崩溃。

发送:

<iq to='unknownuser@server.com' id='141' type='get'><query xmlns='http://jabber.org/protocol/disco#info' node='eu.siacs.conversations.axolotl.devicelist'></query></iq>

RECV:

<iq xml:lang='en' to='myuser@server.com/mobile' from='unknownuser@server.com' type='error' id='141'><query node='eu.siacs.conversations.axolotl.devicelist' xmlns='http://jabber.org/protocol/disco#info'/><error code='407' type='auth'><subscription-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/><text xml:lang='en' xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>Not subscribed</text></error></iq>

Smack 的错误:

无法获取 unknownuser@server.com 的设备列表:..... XMPPError:需要订阅 - 身份验证

那么,我该如何解决呢? 在聊天组中,每个用户都不必见面。当他们聚在一起时,我应该将每个人都添加到每个人的名单中吗?

或者这与房间隶属关系或角色有关?

或者关于 Ejabberd 配置的东西?

[title,<<"groupName">>,  
allow_query_users,true,  
allow_private_messages,true,
allow_private_messages_from_visitors,anyone,
allow_visitor_status,true,  
allow_visitor_nickchange,true,  
public,false,  
public_list,false,  
persistent,true,  
moderated,true,  
members_by_default,true,  
members_only,true,  
allow_user_invites,true,
anonymous,false,
logging,false,
allow_voice_requests,true,
allow_subscription,true,
mam,true,
presence_broadcast,[moderator,participant,visitor],
voice_request_min_interval,1800,
vcard,<<>>,
captcha_whitelist,[],
affiliations,[<<"user1">>,<<"server.com">>,<<>>,member,<<>>,                 <<"user2">>,<<"server.com">>,<<>>,owner,<<>>,                 <<"user3">>,<<"server.com">>,<<>>,member,<<>>],
subject,[],
subject_author,<<>>]

【问题讨论】:

【参考方案1】:

OMEMO 要求发送者能够读取接收者的 OMEMO pubsub 节点。这是获取收件人 preKey 包以构建会话所必需的。

现代实现将 OMEMO pubsub 节点配置为公开的 - 还有一个 ejabberd config 强制旧版客户端这样做。

因此,OMEMO 的大多数客户端实现都将加密功能限制为仅在私人群聊中可用。在这种情况下,所有联系人都在彼此的名册中,并且可以访问彼此的 OMEMO 节点。无论如何,加密公开可用的群聊是没有意义的,因为攻击者可以简单地加入聊天以阅读消息。

如果您想将您的 OMEMO pubsub 节点配置为在您的客户端中公开,请查看smack-openpgp does change to access model 的方法。

【讨论】:

以上是关于使用 OMEMO 加密在 XMPP MultiUserChat 中向未知用户发送消息的主要内容,如果未能解决你的问题,请参考以下文章

通过 OMEMO 进行文件共享,在另一端离线时也可以使用

多用户聊天 OMEMO 加密消息和 MAM (XEP-0313)

如何使用 SMACK OMEMO 为群聊或 MUC 生成指纹?

PHP 中的 XMPP + OTR 加密

如何在 Ejabberd 16.09-4 Debian9 上启用 omemo?

Smack 是不是支持 XMPP 端到端加密 (E2EE)?