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