Nossa equipe desenvolveu um aplicativo híbrido baseado no IndexedDB
suporte a plataformas cruzadas. Este aplicativo agora possui um recurso de bate-papo e queremos armazenar bate-papos para legibilidade offline. Mas, como regra geral, podemos armazenar metadados de bate-papos em texto simples, mas não o conteúdo real do texto da mensagem de bate-papo. Então, decidimos criptografá-los.
Problema: Agora o problema surge quando o usuário deseja pesquisar uma mensagem que contenha alguma palavra específica, pode ser qualquer idioma ou texto.
Tentamos pesquisar o que Whatsapp
implementa essa funcionalidade e encontramos vários artigos como https://www.group-ib.com/blog/whatsapp-forensic-artifacts/ e alguns outros, mas mostra para aplicativos nativos, sqlite
bancos de dados (msgstore.db , wa.db etc) na pasta raiz não são criptografados nem mesmo um único campo. Embora existam alguns bancos de dados criptografados msgstore.db.cryptxx
, a maioria deles são backups.
Questões
Devemos presumir que o Whatsapp apenas criptografa mensagens enquanto envia e recebe, não as armazena?
O WhatsApp armazena mensagens em texto simples na
IndexedDB
web? Não encontramos nenhum, exceto metadados .Se o Whatsapp criptografa todas as mensagens, seja
sqlite
IndexedDB para web, como ele realiza a busca por mensagens?Que opções temos? Como devemos armazenar mensagens no IndexedDB que podem ser criptografadas e ainda pesquisáveis?
Há uma pergunta relacionada a isso , mas não tem a resposta adequada nem é perguntada sobre o IndexedDB, que pode ser facilmente visualizado pelos usuários finais.
A maioria dos aplicativos criptografa apenas os dados em repouso quando estão em um arquivo ou quando estão em trânsito em uma rede. Para trabalhar com dados na memória (como em uma pesquisa), os dados devem ser descriptografados primeiro. Com bancos de dados, isso geralmente é feito usando algum tipo de recurso de "criptografia de dados transparentes", permitindo que o mecanismo SQL do banco de dados veja os dados descriptografados à medida que são lidos no disco. Os dados só são descriptografados na memória durante o uso. Se for transmitido ou gravado em disco, ele será criptografado novamente de forma transparente pelo driver de rede ou banco de dados, independentemente do aplicativo.
Se a sua criptografia estiver sendo tratada pelo seu aplicativo e não pelo banco de dados, o aplicativo precisará ler todos os dados criptografados relevantes de volta na memória e descriptografá-los internamente antes de executar a pesquisa no aplicativo : o mecanismo SQL do banco de dados seria, portanto seria inútil para pesquisas porque o banco de dados nunca veria os dados descriptografados.