我使用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: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.livesoftwaresmackx.omemo.olm.OlmOmemoSession.decryptMessageKey(OlmOmemoSession.java:128) 2019-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) 2019-03-04 13:28:30.112 4291-5181/com.inpedio.sphone W/系统.err: at org.jivesoftware.smackx.omemo.OmemoService.decryptOmemoMessageElement(OmemoService.java:887) 2019-03-04 13:28:30.113 4291-5181/com.inpedio.sphone W/系统.err: at org.jivesoftware.smackx.omemo.OmemoService.processReceivingMessage(OmemoService.java:711) 2019-03-04 13:28:30.114 4291-5181/com.inpedio.sphone W/System.err: atorg.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) 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: at java.lang.Thread。run(Thread.java:764) 2019-03-04 13:28:30.116 4291-5181/com.inpedio.sphone W/ OMEMO服务:内部omemoMessageListener无法解密传入的OMEMO消息:无法解密传输的密钥。因为没有提供消息密钥。提供密钥: 1546815194
我使用的是OlmOmemo和smack库。
发布于 2019-03-05 06:39:26
这是smack-omemo的作者。
您可能希望通过呼叫OmemoManager.requestDeviceListUpdateFor(contactJid)来确保您获得了联系人的所有指纹。在这之后,在调用您的代码之后,您应该有一个完整的联系人设备列表。
至于如何知道哪个指纹属于哪个设备:通常,您希望向用户显示他们自己的和他们的联系人设备的指纹列表。这样你就可以通过比较指纹来找出哪个设备是哪个了。
在OMEMO协议中,故意不使用描述性名称来标识密钥(例如,“手机”、“桌面”等),以激励用户通过扫描二维码来验证指纹。您的问题中包含的例外情况是,您的发送设备“忘记”信任您的接收设备,导致您的接收设备无法对消息进行加密。理想情况下,如果用户试图向具有“未确定”设备的联系人发送消息,并提示他们验证该设备/决定是否信任该设备-同样,理想情况下,通过扫描二维码,您将向用户发出警告。
顺便说一句:你能分享到OlmOmemo的链接吗?我在Google上找不到任何东西,但我很想看看他们是如何实现我的smack-omemo接口的:)
https://stackoverflow.com/questions/54984620
复制相似问题