W firmie, w której kiedyś pracowałem, musiałem zaimplementować odbiornik gniazdowy, który przeważnie pobierał dane w postaci UDP przez połączenie lokalne z jakiegoś specjalistycznego sprzętu czujnikowego. Dane, o których mowa, były dobrze uformowanym pakietem UDP, ale co ciekawe, ładunek danych zawsze kończył się sumą kontrolną CRC16 utworzoną przy użyciu reszty danych.
Zaimplementowałem kontrolę po mojej stronie, zgodnie ze specyfikacją, ale zawsze zastanawiałem się, czy to było konieczne. W końcu, czy sam protokół UDP nie zawiera 16-bitowego CRC? Dlatego chociaż pakiety UDP mogą zostać utracone lub przestarzałe, miałem wrażenie, że nie można ich uszkodzić bez odrzucenia przez sprzęt sieciowy, zanim dotrą do procesów systemu operacyjnego. A może brakuje mi jakiegoś specjalnego przypadku użycia?
Warto dodać, że pracowałem w przemyśle obronnym, który, jak jestem pewien, można sobie wyobrazić, lubi być bardzo precyzyjny w takich sprawach, więc zastanawiam się, czy to był tylko przypadek „bezpieczeństwa OCD”. ..
źródło
Odpowiedzi:
Protokół UDP nie gwarantuje, że wiadomości są dostarczane na zamówienie lub dostarczane w ogóle, ale to nie gwarantuje, że te komunikaty, które mają dostać dostarczane są kompletne i niezmienione przez automatyczne tym kontrolną 16-bitowego. Oznacza to, że dodanie kolejnej 16-bitowej sumy kontrolnej na warstwie aplikacji jest zwykle zbędne.
...zazwyczaj....
Po pierwsze, w przypadku IPv4 (nie IPv6) suma kontrolna jest opcjonalna . Oznacza to, że korzystasz z egzotycznej konfiguracji, która nie generuje i nie sprawdza sumy kontrolnej (ale w takim przypadku powinieneś raczej naprawić stos sieciowy zamiast sędziować to na warstwie aplikacji).
Po drugie, z 16-bitową sumą kontrolną istnieje szansa na 65536, że przypadkowa wiadomość ma prawidłową sumę kontrolną. Kiedy ten margines błędu jest zbyt duży dla twojego przypadku użycia (a w przemyśle obronnym mógłbym sobie wyobrazić kilka tam, gdzie jest), dodanie kolejnej sumy kontrolnej CRC-16 jeszcze bardziej ją zmniejszy. Ale w takim przypadku możesz rozważyć użycie odpowiedniego skrótu wiadomości, takiego jak SHA-256 zamiast CRC-16. Lub przejdź całą drogę i użyj prawdziwego podpisu kryptograficznego. Chroni to nie tylko przed przypadkowym uszkodzeniem, ale także umyślnym uszkodzeniem przez atakującego.
Po trzecie, w zależności od tego, skąd dane pochodzą i dokąd trafiają, mogą zostać uszkodzone przed lub po wysłaniu przez sieć. W takim przypadku dodatkowa suma kontrolna w komunikacie może chronić integralność wiadomości bardziej niż tylko między dwoma hostami sieciowymi.
źródło
UDP zapewnia jednak sumę kontrolną.
Widzę więc uzasadnione powody, by nie ufać sumie kontrolnej UDP, ale równie nie ufać sumie kontrolnej UDP, a następnie implementować podobnie słabą sumę kontrolną na poziomie aplikacji wydaje się dziwne.
Istnieje możliwość, że osoba opracowująca protokół po prostu nie wiedziała, że UDP zapewnia sumy kontrolne lub że protokół jest w rzeczywistości niewielkim wariantem takiego, który jest przeznaczony do pracy na nośniku, który nie zapewnia sum kontrolnych.
PS, ponieważ ten post jest oznaczony jako bezpieczeństwo, pamiętaj, że sumy kontrolne mają na celu ochronę przed przypadkowymi zmianami. Ochrona przed celową modyfikacją lub fałszowaniem wymaga zarówno użycia funkcji skrótu kryptograficznego, które są odporne na celowe zderzenia / preimages, jak i użycia niektórych mechanizmów (np. Podpisów wykonanych za pomocą klucza publicznego) w celu sprawdzenia, że same skróty nie zostały zmodyfikowane.
źródło