Como faço para proteger a comunicação entre o aplicativo e o dispositivo IoT?


18

Atualmente, estou trabalhando em um projeto que inclui comunicação Bluetooth entre um aplicativo móvel (atualmente usando a plataforma Ionic) e um dispositivo incorporado. Para comparação, nosso produto é semelhante a um bloqueio inteligente .

A segurança é a maior preocupação, e estamos procurando maneiras de garantir que nosso hardware e software não sejam invadidos. Que medidas devemos tomar para garantir que nosso sistema seja seguro?

Editar: Sim, atualmente estamos criptografando as comunicações e usando HTTPS quando o dispositivo se comunica com nosso servidor.


Usar HTTPS? Você está codificando os dois dispositivos? Criptografia?
Mawg diz que restabelece Monica


2
@ Makaw Tanto quanto sei, o HTTPS não é aplicável ao bluetooth (ou pelo menos não no sentido normativo / sensato).
Goldilocks

1
Estou votando para fechar esta questão como fora de tópico, porque isso não mostra como isso é específico da IoT. É apenas garantir a comunicação entre dispositivos.
Helmar

4
@ Helmar A comunicação entre dispositivos é um recurso muito importante da IoT, mesmo um recurso definidor, por isso não entendo por que essa pergunta estaria fora de tópico.
Gilles 'SO- stop be evil'

Respostas:


13

Para garantir que seu dispositivo seja seguro o suficiente, tenho várias dicas:

  1. Adicione um pouco de criptografia à comunicação Bluetooth. Eu recomendo manter as chaves de criptografia fora do ar. Por exemplo, você pode pedir ao usuário para digitalizar um código QR que esteja no dispositivo, impresso na caixa etc. na configuração inicial do aplicativo móvel, talvez com uma tecla AES? Você decide. Isso evita que alguém veja a senha transmitida pelo ar com texto simples.
  2. Se puder, fique longe do modo ECB (use CBC) do algoritmo de criptografia escolhido, pois ele pode fornecer algumas informações sobre os dados transmitidos. Mais informações sobre isso podem ser encontradas aqui .
  3. Na transmissão de dados bluetooth, inclua um ID exclusivo, para que a mensagem não possa ser repetida (por exemplo, você pode incluir um carimbo de data / hora). Você também pode implementar algum sistema semelhante ao TOTP.
  4. Coloque uma porta no dispositivo que permita piscar facilmente, para que, caso você perceba que o software possui um bug (e por algum motivo não possa atualizá-lo OTA), o dispositivo não seja um peso de papel caro, apenas um dispositivo precisa ser conectado a um PC e atualizado para um novo software.
  5. Extra: para garantir que alguém com um certificado raiz não autorizado (provavelmente auto-emitido e instalado no dispositivo do cliente) não possa interceptar as comunicações do servidor, verifique o certificado HTTPS. Aqui está um pedido do SO para Android, você também deve encontrar recursos semelhantes para o iOS .

Além disso, se você quiser saber mais sobre criptografia e criptografia que usará para proteger seu dispositivo, consulte este e-livro (gratuito) . Ele fala muito sobre implementações boas e ruins de algoritmos de criptografia e deve ajudá-lo a proteger seu produto. (Nota 1: Por favor, não crie seu próprio algoritmo. Nota 2: Eu não sou afiliado ao crypto101 ou lvh.)


2
"Se você puder, fique longe do BCE". Não, maus conselhos. O conselho aceitável seria “nunca use o BCE”, mas ainda é incompleto. Uma resposta melhor seria dizer que se você estiver digitando as letras CBC no seu código, estará fazendo errado . Em particular, o AES-CBC não garante a integridade ou autenticidade da comunicação.
Gilles 'SO- stop be evil'

O @Gilles ECB é certamente melhor do que todos os dispositivos IOT existentes hoje em dia que apenas transmitem coisas como texto sem formatação ou simplesmente xor com um valor definido, mas sim, o BCE quase não faz com que seu produto "não seja hackável" (tecnicamente nada faz, mas você pode tentar fazer algo que o mantenha o mais seguro possível no momento, e que isso não envolva o BCE, mas uma implementação adequada do AES-CBC 256).
Ave

13

Se você pode ter o TCP de ponta a ponta, use o TLS de ponta a ponta (por exemplo, com HTTPS).

Não reinvente a roda, especialmente quando se trata de criptografia - a maioria das pessoas entende errado. A menos que o dispositivo tenha recursos muito limitados para oferecer suporte ao TLS, se você atingir o nível de AES, estará fazendo errado . O erro número 1 é criptografar e esquecer de se autenticar - se você possui um canal criptografado entre o servidor e um intermediário, em vez de um canal criptografado entre o servidor e o dispositivo, a criptografia não oferece nenhum benefício . Se você não pode usar o TLS, verifique se o protocolo que você está usando autentica tudo e criptografa o que precisa ser confidencial.

Para usar o TLS com segurança, pense nas garantias que você precisa ter, do ponto de vista de cada participante. Geralmente, o dispositivo precisa saber que está falando com o servidor legítimo. Isso significa que ele deve verificar o certificado do servidor. O dispositivo deve ter o certificado X.509 de uma autoridade de certificação registrado como confiável; isso requer armazenamento que não pode ser modificado por um invasor, mas não exige nenhuma confidencialidade do armazenamento. Observe que você não deve codificar diretamente o certificado do servidor, pois isso não permitirá que você substitua facilmente esse certificado se ele estiver comprometido. Em vez disso, o dispositivo armazena a identidade esperada(nome do host) do servidor e o certificado de uma autoridade de certificação que garante que uma determinada chave pública pertença ao nome do host esperado. Mais uma vez, não reinvente a roda, confie na verificação de certificado fornecida pela sua biblioteca ou aplicativo TLS.

Se o servidor precisar saber que está conversando com um cliente legítimo, cada cliente precisará ter seu próprio certificado de cliente. Isso requer armazenamento confidencial no cliente. Passe o certificado do cliente para a função de abertura da sessão TLS da sua biblioteca TLS ou defina-o na configuração do aplicativo.

Isso cuida da segurança da comunicação entre o servidor e o dispositivo. Se o aplicativo móvel puder conversar diretamente com o dispositivo (por exemplo, para permitir a operação desconectada enquanto estiver na rede Wi-Fi local), é necessário primeiro fazer o emparelhamento entre o comutador inteligente e o telefone celular. Emparelhamento significa uma troca de chaves, preferencialmente uma troca de chaves públicas, se os recursos permitirem, caso contrário, um acordo de chaves secretas. O objetivo desse emparelhamento é garantir que cada dispositivo saiba com quem está falando.

Você também precisará proteger o canal de controle, seja ele diretamente do dispositivo móvel até o comutador inteligente ou via servidor. Pense na autorização: existem diferentes níveis de acesso ao comutador, por exemplo, um nível de controle que permita a reconfiguração e um canal básico que permite a ativação / desativação do comutador? Isso geralmente é tratado por uma etapa de autenticação após o estabelecimento do canal seguro (TLS, se possível).

Outra consideração são as atualizações de firmware. Essa é uma questão complicada: por um lado, não existe segurança absoluta; portanto, você terá patches de segurança para aplicar de vez em quando. Por outro lado, um mecanismo de atualização de firmware é uma coisa complexa e pode ter bugs. No mínimo, verifique se as atualizações de firmware estão assinadas. Depender exclusivamente da segurança do canal de comunicação para atualizações é complicado, porque a base confiável para um canal seguro é maior do que para uma verificação de segurança estática e, às vezes, você pode aplicar atualizações de firmware sem uma conexão de rede. Além de verificar a assinatura, o ideal é você ter alguma proteção contra reversão, para que um adversário possa '

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.