Para uma empresa em que eu trabalhava, tive que implementar um receptor de soquete que, em sua maioria, usava dados em formato UDP por uma conexão local de algum hardware de sensor especializado. Os dados em questão eram um pacote UDP bem formado, mas, curiosamente, a carga útil dos dados sempre terminava com uma soma de verificação CRC16 formada usando o restante dos dados.
Eu implementei a verificação no meu final, conforme as especificações, mas sempre me perguntei se isso era necessário. Afinal, o próprio protocolo UDP não carrega um CRC de 16 bits? Portanto, embora os pacotes UDP possam ser perdidos ou fora de ordem, fiquei com a impressão de que eles não podem ser corrompidos sem serem descartados pelo hardware da rede antes de atingirem os processos do sistema operacional. Ou há algum caso de uso especial em falta?
Vale acrescentar que eu estava trabalhando na indústria de defesa, que, como posso imaginar, gosta de ser super-explícita em relação a tudo isso, por isso estou me perguntando se foi apenas um caso de "OCD de segurança". ..
fonte
Respostas:
O protocolo UDP não garante que as mensagens sejam entregues em ordem ou entregues em tudo, mas garante que essas mensagens que não se entregues estão completos e inalterados, incluindo automaticamente uma soma de verificação de 16 bits. Isso significa que adicionar outra soma de verificação de 16 bits na camada do aplicativo geralmente é redundante.
...usualmente....
Primeiro, com o IPv4 (não o IPv6), a soma de verificação é opcional . Isso significa que você pode estar usando uma configuração exótica que não gera geração e validação de soma de verificação (mas, nesse caso, você deve preferir consertar sua pilha de rede em vez de manipular isso por júri na camada de aplicação).
Segundo, com uma soma de verificação de 16 bits, há uma chance em 65536 de que uma mensagem completamente aleatória tenha uma soma de verificação válida. Quando essa margem de erro é muito grande para o seu caso de uso (e no setor de defesa eu poderia imaginar vários onde está), a adição de outra soma de verificação CRC-16 a reduziria ainda mais. Mas, nesse caso, você pode considerar usar um resumo de mensagem adequado como SHA-256 em vez de CRC-16. Ou vá até o fim e use uma assinatura criptográfica real. Isso protege não apenas a corrupção aleatória, mas também a corrupção intencional de um invasor.
Terceiro, dependendo de onde os dados vêm e para onde vão, eles podem estar corrompidos antes ou depois de serem enviados pela rede. Nesse caso, a soma de verificação adicional dentro da mensagem pode proteger a integridade da mensagem mais do que apenas entre os dois hosts de rede.
fonte
No entanto, o UDP fornece uma soma de verificação.
Portanto, posso ver razões legítimas para não confiar na soma de verificação UDP, mas igualmente não confiar na soma de verificação UDP e, em seguida, implementar uma soma de verificação igualmente fraca no nível do aplicativo parece estranho.
Existe a possibilidade de a pessoa que deseja o protocolo simplesmente não saber que o UDP forneceu somas de verificação ou que o protocolo é na verdade uma ligeira variante de uma projetada para executar sobre uma mídia que não fornece somas de verificação.
PS: como esta postagem é marcada como segurança, saiba que as somas de verificação em questão foram projetadas para proteger contra alterações inadvertidas. Proteger contra modificação ou falsificação deliberada requer o uso de funções hash criptográficas resistentes a colisões / pré-imagens deliberadas e o uso de algum mecanismo (por exemplo, assinaturas feitas usando uma chave pública) para verificar se os hashes em si não foram modificados.
fonte