Pour une entreprise pour laquelle je travaillais auparavant, j'ai dû implémenter un récepteur de socket qui prenait principalement des données sous forme UDP via une connexion locale à partir d'un matériel de capteur spécialisé. Les données en question étaient un paquet UDP bien formé, mais il est intéressant de noter que la charge utile des données se terminait toujours par une somme de contrôle CRC16 formée en utilisant le reste des données.
J'ai implémenté la vérification de mon côté, conformément aux spécifications, mais je me suis toujours demandé si c'était nécessaire. Après tout, le protocole UDP lui-même ne comporte-t-il pas un CRC 16 bits? Par conséquent, bien que les paquets UDP puissent être perdus ou hors service, j'avais l'impression qu'ils ne peuvent pas être corrompus sans être éliminés par le matériel réseau avant d'atteindre les processus du système d'exploitation. Ou y a-t-il un cas d'utilisation spécial qui me manque?
Cela vaut la peine d'ajouter que je travaillais dans l'industrie de la défense, qui, comme vous pouvez l'imaginer, aime être super explicite à propos de tout cela, alors je me demande si ce n'était qu'un cas de "OCD de sécurité". ..
la source
Réponses:
Le protocole UDP ne garantit pas que les messages sont livrés dans l' ordre ou du tout, mais il ne garantit que ces messages qui ne se sont livrés complets et sans changement en incluant automatiquement une somme de contrôle 16 bits. Cela signifie que l'ajout d'une autre somme de contrôle 16 bits sur la couche application est généralement redondant.
...d'habitude....
Tout d'abord, avec IPv4 (pas IPv6), la somme de contrôle est facultative . Cela signifie que vous utilisez peut-être une configuration exotique qui ne fait pas de génération et de validation de somme de contrôle (mais dans ce cas, vous devriez plutôt corriger votre pile réseau au lieu de truquer cela sur la couche application).
Deuxièmement, avec une somme de contrôle de 16 bits, il y a une chance sur 65536 qu'un message complètement aléatoire se trouve avoir une somme de contrôle valide. Lorsque cette marge d'erreur est trop grande pour votre cas d'utilisation (et dans l'industrie de la défense, je pourrais en imaginer plusieurs où elle se trouve), l'ajout d'une autre somme de contrôle CRC-16 la réduirait davantage. Mais dans ce cas, vous pourriez envisager d'utiliser un résumé de message approprié comme SHA-256 au lieu de CRC-16. Ou allez jusqu'au bout et utilisez une véritable signature cryptographique. Cela protège non seulement contre la corruption aléatoire mais aussi la corruption intentionnelle par un attaquant.
Troisièmement, selon la provenance et la destination des données, elles peuvent être corrompues avant ou après leur envoi sur le réseau. Dans ce cas, la somme de contrôle supplémentaire à l'intérieur du message peut protéger l'intégrité du message plus qu'entre les deux hôtes du réseau.
la source
UDP fournit cependant une somme de contrôle.
Je peux donc voir des raisons légitimes de ne pas faire confiance à la somme de contrôle UDP, mais également de ne pas faire confiance à la somme de contrôle UDP, puis d'implémenter une somme de contrôle similaire au niveau de l'application semble étrange.
Il est possible que la personne qui conçoit le protocole ne sache tout simplement pas que UDP a fourni des sommes de contrôle ou que le protocole est en fait une légère variante de celui conçu pour fonctionner sur un support qui ne fournit pas de sommes de contrôle.
PS puisque ce post est étiqueté sécurité, sachez que les sommes de contrôle en question sont conçues pour vous protéger contre les modifications involontaires. La protection contre la modification délibérée ou l'usurpation d'identité nécessite à la fois l'utilisation de fonctions de hachage cryptographiques résistantes aux collisions / préimages délibérées et l'utilisation d'un mécanisme (par exemple, les signatures faites à l'aide d'une clé publique) pour vérifier que les hachages eux-mêmes n'ont pas été modifiés.
la source