首页 > 解决方案 > 使用端到端加密时如何实现聊天中消息的搜索功能?

问题描述

如果我将端到端加密添加到我编写的聊天应用程序中,我将无法在服务器端读取交换消息的内容,因此如果我想保留消息搜索功能,我需要实现它用另一种方式。

什么是正确的最佳实践?

我想到了以下几种可能:

  1. 在每台设备上存储一个本地数据库(例如 SQLite),其中消息将以未加密格式存储。

    但这有一些缺点:除了消息未加密存储这一事实之外,该应用程序也可以通过 Web 浏览器访问,在这种情况下,我无法将整个对话存储在浏览器的会话存储中(我什至不认为他们会合身)。

    此外,这样我就不再有唯一的事实来源(必须处理存储加密消息的服务器端数据库以及用于未加密消息的本地“设备端”SQLite DB)。

    所以我认为这不是一条可行的道路。

  2. 在客户端(无论是网络浏览器还是设备)上,当用户在聊天中执行搜索时,下载该聊天的所有消息,全部解密,然后执行内存搜索。

    缺点:我必须下载所有聊天记录才能执行搜索。如果聊天的历史很长,很可能所有数据都无法放入内存。下载历史记录后,我可以将其存储在内存中,直到用户重新加载页面(如果使用 Web 浏览器)或终止并重新启动应用程序(如果使用智能手机或平板电脑等设备)。

    优点:我可以显示找到搜索词的消息数量。

  3. 与 2 相同,但我将向服务器执行多个请求,每个请求仅获取聊天消息的一小部分,例如当用户搜索“foo”时,最初我将向服务器询问最后 30 条消息,解密他们在客户端上,搜索“foo”,仅显示该块中包含“foo”的消息的结果和计数,当用户滚动或按下“搜索更多”按钮时,执行另一个请求,该请求将获取另一个块在 30 条消息中,将这些添加到结果中,并在考虑到第 n 个块之后增加匹配消息的计数。

    缺点:我无法在第一次搜索时显示匹配消息的总数。

  4. 还要别的吗?也许是一个更好的解决方案,它也被 Telegram 或 WhatsApp 等其他服务使用(我知道它们都为他们的聊天实现了端到端加密)。

标签: searchencryptionchatend-to-end-encryption

解决方案


推荐阅读