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

问题描述 投票:2回答:1

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

MUC房间是persistent,他们allow_subscription用于Muc / Sub支持,用于离线消息。

当客户以“所有者”的身份开始新房间并从他的名单中添加“成员”时;所有的客户都加入了房间,一切都很好。所有者可以向该组发送消息,并将其发送给每个成员。

但是当一个小组成员试图发送消息时,如果他不“知道”该小组的所有成员(如果他们不在他的名单中),他就不能发送消息!

我发现,当向组发送OMEMO消息时,有必要为每个成员单独加密消息,这需要获得每个成员的devicelist

在这一步:

mOmemoManager.encrypt(muc, msgBody);

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

发送方:

<iq to='[email protected]' 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='[email protected]/mobile' from='[email protected]' 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的错误:

无法获取[email protected]的设备列表:..... XMPPError:subscription-required - auth

那么,我怎么解决这个问题呢?在聊天组中,每个用户不必相互见面。当他们聚集在一起时,我应该把每个人都添加到每个人的名单中吗?

或者这是关于房间隶属关系还是角色?

或者关于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,<<>>}]
ejabberd smack multiuserchat omemo
1个回答
1
投票

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

现代实现将OMEMO pubsub节点配置为公共 - 还有一个ejabberd config来强制它用于旧版客户端。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.