0

我正在使用 Omemo 和 smack 库来创建聊天应用程序。我有以下场景:我想在两个设备之间进行通信,设备 A 和设备 B。A 正在向 B 发送消息。我想发现 B 的指纹,以便检查我是否信任该设备. 我正在做的是使用这种方法:

 HashMap<OmemoDevice, OmemoFingerprint> activeFingerprints =
                omemoManager.getActiveFingerprints(JidCreate.bareFrom(jid));
     for (final Map.Entry<OmemoDevice, OmemoFingerprint> entry : activeFingerprints.entrySet()) {
                result = omemoManager.isTrustedOmemoIdentity(entry.getKey(), entry.getValue());
                if (!result) {
                    break;
                }
            }

但这有时会返回给我 6 个指纹,我不知道哪个是确切的。因此,我认为我经常收到这条消息:

java:1162) 2019-03-04 13:28:30.115 4291-5181/com.inpedio.sphone W/System.err: 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 2019- 03-04 13:28:30.115 4291-5181/com.inpedio.sphone W/System.err: at java.lang.Thread.run(Thread.java:764) 2019-03-04 13:28:30.116 4291- 5181/com.inpedio.sphone W/OmemoService:内部 omemoMessageListener 无法解密传入的 OMEMO 消息:传输的密钥无法解密,因为没有提供消息密钥。提供密钥:[1546815194] 内部 omemoMessageListener 无法解密传入的 OMEMO 消息:无法解密传输的密钥,因为没有提供消息密钥。提供密钥:[1546815194] 内部 omemoMessageListener 无法解密传入的 OMEMO 消息:无法解密传输的密钥,因为没有提供消息密钥。提供密钥:[1546815194]

我正在使用 OlmOmemo 和 smack 库。

4

1 回答 1

2

smack-omemo 作者在这里。

您可能希望通过调用 确保您获得了联系人的所有指纹OmemoManager.requestDeviceListUpdateFor(contactJid)。之后,您应该在调用代码后获得联系人设备的完整列表。

至于如何知道哪个指纹属于哪个设备:通常您希望向用户呈现他们自己和他们的联系人设备的指纹列表。这样您就可以通过比较指纹找出哪个设备是哪个设备。

在 OMEMO 协议中,为了激励用户通过扫描 QR 码验证指纹,故意不使用描述性名称(例如“电话”、“桌面”等)来识别密钥。您在问题中包含的例外情况表明您的发送设备“忘记”信任您的接收设备,导致消息未针对您的接收设备进行加密。理想情况下,如果用户尝试向具有“未确定”设备的联系人发送消息并提示他们验证该设备/决定是否信任该设备,您将向用户显示警告 - 再次,理想情况下通过扫描 QR代码。

顺便说一句:你能分享一个到 OlmOmemo 的链接吗?我在 Google 上找不到任何东西,但我很想看看他们是如何实现我的 smack-omemo 接口的 :)

于 2019-03-04T22:39:25.987 回答