我正在使用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个指纹,但我不知道哪一个是确切的。因此,我认为我经常收到此消息:
2019-03-04 13:28:30.111 4291-5181 / com.inpedio.sphone W / System.err:org.matrix.olm.OlmException:BAD_MESSAGE_MAC 2019-03-04 13:28:30.111 4291-5181 / com.inpedio.sphone W / System.err:在org.matrix.olm.OlmSession.decryptMessage(OlmSession.java:336) 2019-03-04 13:28:30.112 4291-5181 / com.inpedio.sphone W / System.err:在org.livesoftware.smackx.omemo.olm.OlmOmemoSession.decryptMessageKey(OlmOmemoSession.java:128) 2019-03-04 13:28:30.112 4291-5181 / com.inpedio.sphone W / System.err:在org.jivesoftware.smackx.omemo.internal.OmemoSession.decryptTransportedKey(OmemoSession.java:109) 2019-03-04 13:28:30.112 4291-5181 / com.inpedio.sphone W / System.err:在org.jivesoftware.smackx.omemo.OmemoService.decryptTransportedOmemoKey(OmemoService.java:917) 2019-03-04 13:28:30.112 4291-5181 / com.inpedio.sphone W / System.err:在org.jivesoftware.smackx.omemo.OmemoService.decryptOmemoMessageElement(OmemoService.java:887) 2019-03-04 13:28:30.113 4291-5181 / com.inpedio.sphone W / System.err:在org.jivesoftware.smackx.omemo.OmemoService.processReceivingMessage(OmemoService.java:711) 2019-03-04 13:28:30.114 4291-5181 / com.inpedio.sphone W / System.err:at org.jivesoftware.smackx.omemo.OmemoService.access $ 200(OmemoService.java:104) 2019-03-04 13:28:30.114 4291-5181 / com.inpedio.sphone W / System.err:在org.jivesoftware.smackx.omemo.OmemoService $ OmemoStanzaListener.processStanza(OmemoService.java:1238) 2019-03-04 13:28:30.114 4291-5181 / com.inpedio.sphone W / System.err:at org.jivesoftware.smack.AbstractXMPPConnection $ 4.run(AbstractXMPPConnection.java:1204) 2019-03-04 13:28:30.115 4291-5181 / com.inpedio.sphone W / System.err:在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 2019-03-04 13:28:30.115 4291-5181 / com.inpedio.sphone W / System.err:at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:636) 2019-03-04 13:28:30.115 4291-5181 / com.inpedio.sphone W / System.err:在java.lang.Thread.run(Thread.java:764) 2019-03-04 13:28:30.116 4291-5181 / com.inpedio.sphone W / OmemoService:内部omemoMessageListener无法解密传入的OMEMO消息:由于未提供消息密钥,因此无法解密传输密钥。提供密钥:[1546815194]
我正在使用OlmOmemo和smack库。
答案 0 :(得分:2)
smack-omemo作者在这里。
您可能想通过致电OmemoManager.requestDeviceListUpdateFor(contactJid)
确保获得了联系人的所有指纹。之后,调用代码后,您应该具有联系人设备的完整列表。
关于如何知道哪个指纹属于哪个设备: 通常,您想向用户提供他们自己和他们的联系人设备的指纹列表。这样,您可以通过比较指纹来找出哪个设备。
在OMEMO协议中,故意不使用描述性名称(例如“电话”,“桌面”等)标识密钥,以激励用户通过扫描QR码来验证指纹。问题中包含的例外情况是指示发送设备“忘记了”信任接收设备,从而导致该消息未针对接收设备进行加密。理想情况下,如果用户尝试向具有“未定”设备的联系人发送消息并提示他们验证该设备/决定是否信任该设备,则向用户显示警告,再次,最好是通过扫描QR代码。
顺便说一句:您可以共享一个指向OlmOmemo的链接吗?我在Google上找不到任何东西,但是我很想看看他们如何实现我的smack-omemo界面:)