Como adiciono criptografia em nível de aplicativo a uma conexão Android BLE?

Aug 17 2020

O Bluetooth Low Energy Android documentação recomenda adicionar criptografia de camada de aplicativo on-top da conexão BLE se os dados trocados é sensível:

Cuidado : quando um usuário emparelha seu dispositivo com outro dispositivo usando BLE, os dados que são comunicados entre os dois dispositivos são acessíveis a todos os aplicativos no dispositivo do usuário.

Por esse motivo, se seu aplicativo captura dados confidenciais, você deve implementar a segurança da camada de aplicativo para proteger a privacidade desses dados.

Como gostaria de evitar "fazer minha própria criptografia", estou procurando uma maneira pronta para produção de criptografar pacotes.

Tenho um canal fora de banda para trocar uma mensagem (por exemplo, chave) de um participante para outro (código QR). Ambos os participantes são dispositivos Android, um operando em modo de servidor (periférico) e outro como cliente (central).

Eu olhei para o Noise Protocol Framework como uma alternativa mais leve ao TLS, mas parece que ainda é muito trabalho manual (?).

Existe uma solução fácil? Parece que este tem que ser um problema resolvido.

Respostas

1 CBHacking Aug 18 2020 at 05:26

Primeiro, um conselho: StackExchange não é para recomendar produtos específicos, então vou ser relativamente genérico aqui. Quem quer que leia isso no futuro pode estar em um mundo onde existem alternativas novas e muito melhores, ou mesmo onde a velha guarda foi quebrada.

Existem várias bibliotecas de criptografia de alto nível que - com uma chave pré-compartilhada - lidarão com a criptografia de mensagem ou possivelmente stream (e requisitos de segurança relacionados, como integridade de dados) com um mínimo de esforço. Basta pesquisar por "biblioteca de criptografia fácil" para encontrar alguns candidatos. Observe que muitas pessoas ignoram o conselho contra a criação de sua própria criptografia, e algumas delas a publicam, então você quer ter certeza de que a biblioteca que você escolher seja bem revisada por especialistas, de preferência não relacionada ao seu desenvolvimento.

Você também deve considerar o que exatamente deseja (e precisa) de sua biblioteca. Ele precisa oferecer suporte a fluxos criptografados de comprimento arbitrário (ou mensagens muito grandes que não cabem facilmente na memória) ou um protocolo simples baseado em mensagens funcionará? A biblioteca deve ser muito pequena, em termos de pegada de instalação ou uso de RAM? Muito rápido, em uma determinada CPU? Compatível com qualquer outra biblioteca particular? Use cifras específicas ou outras primitivas por motivos de conformidade (espero que não)? Disponível em um determinado idioma?


Para alguns exemplos bem considerados em meados de 2020, considere LibSodium ou Monocypher . Ambos são bem considerados, revisados ​​e focados na facilidade de uso. Outras alternativas são NaCl, LibHydrogen e assim por diante. Observe que nem todos focam igualmente a segurança, a velocidade ou a conveniência; por exemplo, TweetNaCl enfatiza o tamanho mínimo do código, sacrificando muita velocidade e potencialmente alguma segurança no processo, em comparação com o NaCl original.