ข้อมูลที่บรรจุใน UDP ควรมี CRC หรือไม่


16

สำหรับ บริษัท ที่ฉันเคยทำงานให้ฉันต้องใช้ตัวรับสัญญาณซ็อกเก็ตที่ส่วนใหญ่ใช้ข้อมูลในรูปแบบ UDP ผ่านการเชื่อมต่อท้องถิ่นจากฮาร์ดแวร์เซ็นเซอร์บางตัว ข้อมูลที่เป็นปัญหาคือแพ็คเก็ต UDP ที่มีรูปแบบที่ดี แต่ที่น่าสนใจปริมาณข้อมูลนั้นจะสิ้นสุดลงด้วยการตรวจสอบ CRC16 ที่เกิดขึ้นโดยใช้ข้อมูลที่เหลือ

ฉันใช้การตรวจสอบในตอนท้ายของฉันตามข้อกำหนด แต่ฉันมักจะสงสัยว่านี่เป็นสิ่งที่จำเป็น ท้ายที่สุดแล้วโปรโตคอล UDP เองนั้นไม่มีซีอาร์ซีแบบ 16 บิตหรือไม่? ดังนั้นแม้ว่าแพ็กเก็ต UDP อาจสูญหายหรือล้าสมัยได้ แต่ฉันรู้สึกว่ามันไม่สามารถเสียหายได้หากไม่ได้รับการละทิ้งโดยฮาร์ดแวร์เครือข่ายก่อนที่จะถึงกระบวนการของระบบปฏิบัติการ หรือมีกรณีใช้พิเศษบางอย่างที่ฉันขาดไป

เป็นมูลค่าเพิ่มที่ฉันทำงานในอุตสาหกรรมการป้องกันประเทศซึ่งในขณะที่ฉันแน่ใจว่าคุณสามารถจินตนาการชอบที่จะชัดเจนเกี่ยวกับทุกอย่างเช่นนี้ดังนั้นฉันสงสัยว่ามันเป็นเพียงกรณีของ "ความปลอดภัย OCD" ..


2
หากเป็นเพื่อความปลอดภัยไม่ใช่เพียงเพื่อป้องกันการทุจริตโดยไม่ตั้งใจคุณต้องใช้ MAC ซึ่งเทียบเท่ากับการตรวจสอบกุญแจ
CodesInChaos

1
การตรวจสอบ UDP นั้นดีสำหรับข้อมูลที่ถูกส่งไปยังแพ็กเก็ต UDP เท่านั้น สิ่งที่สร้างการตรวจสอบจริง? การตรวจสอบใช้อะไร? มันถูกใช้เพื่อรับรองความถูกต้องก่อนที่จะสร้างแพ็กเก็ต UDP หรืออาจจะนำไปพร้อมกับแพ็คเก็ตเพื่อให้แน่ใจว่ามันจะรักษาความสมบูรณ์ในขณะที่มันไหลผ่านระบบอื่น ๆ ? หากไม่มีความเข้าใจที่กว้างขึ้นเกี่ยวกับองค์ประกอบของระบบของคุณและวิธีการสร้าง, แปลง, และใช้ข้อมูลฉันไม่แน่ใจว่าคำถามของคุณสามารถตอบได้
โธมัสโอเวนส์

@ThomasOwens ข้อมูลถูกส่งจากอุปกรณ์ต้นทางไปกลับไปยังฮาร์ดแวร์ที่รับ ไม่มีชายกลาง การตรวจสอบถูกสร้างขึ้นโดยผู้ริเริ่มเป็นขั้นตอนสุดท้ายก่อนที่จะส่ง
Xenoprimate

คำตอบ:


23

โปรโตคอล UDPไม่ได้รับประกันว่าข้อความจะถูกส่งในการสั่งซื้อหรือส่งเลย แต่ก็ไม่แน่ใจว่าข้อความเหล่านั้นซึ่งไม่ได้รับการส่งมอบจะเสร็จสมบูรณ์และไม่เปลี่ยนแปลงโดยรวมถึงการตรวจสอบ 16 บิตโดยอัตโนมัติ นั่นหมายถึงการเพิ่มการตรวจสอบอีก 16 บิตบนชั้นแอปพลิเคชันมักจะซ้ำซ้อน

... มักจะ ....

ก่อนอื่นด้วย IPv4 (ไม่ใช่ IPv6) การตรวจสอบจะทำหรือไม่ก็ได้ นั่นหมายความว่าคุณอาจกำลังใช้การกำหนดค่าที่แปลกใหม่ซึ่งไม่ได้สร้างการตรวจสอบและการตรวจสอบความถูกต้อง (แต่ในกรณีนี้คุณควรแก้ไขเครือข่ายสแต็กของคุณแทนการทำเช่นนี้ในชั้นแอพพลิเคชัน)

ประการที่สองด้วยการตรวจสอบ 16 บิตมีโอกาสหนึ่งใน 65536 ที่ข้อความสุ่มสมบูรณ์เกิดขึ้นที่จะมีการตรวจสอบที่ถูกต้อง เมื่อขอบของข้อผิดพลาดนี้มีขนาดใหญ่เกินไปสำหรับกรณีการใช้งานของคุณ (และในอุตสาหกรรมการป้องกันฉันสามารถจินตนาการได้หลาย ๆ ที่) การเพิ่มการตรวจสอบ CRC-16 อีกครั้งจะช่วยลดปัญหาได้ แต่ในกรณีนี้คุณอาจพิจารณาใช้ข้อความสรุปที่เหมาะสมเช่น SHA-256 แทน CRC-16 หรือไปตลอดทางและใช้ลายเซ็นเข้ารหัสลับที่แท้จริง สิ่งนี้ไม่เพียง แต่ป้องกันการคอร์รัปชั่นแบบสุ่ม แต่ยังป้องกันการทุจริตโดยผู้โจมตีด้วย

ข้อสามขึ้นอยู่กับว่าข้อมูลมาจากไหนและไปที่ใดข้อมูลนั้นอาจเสียหายก่อนหรือหลังถูกส่งผ่านเครือข่าย ในกรณีนั้นการตรวจสอบเพิ่มเติมภายในข้อความอาจป้องกันความสมบูรณ์ของข้อความได้มากกว่าระหว่างโฮสต์เครือข่ายทั้งสอง


3
ทำไมการเข้ารหัสลับ ? ข้อ จำกัด ที่ใช้ในการออกแบบแฮชการเข้ารหัสไม่เหมือนกับที่ใช้ในการออกแบบแฮชที่ใช้ในการส่งข้อมูล (ตัวอย่างเช่นการใช้ทรัพยากรอย่างเข้มข้นเป็นคุณสมบัติสำหรับแฮชการเข้ารหัสลับและปัญหาในการส่งข้อมูล)
AProgrammer

1
@AProgrammer ฉันยอมรับว่าการเลือกคำศัพท์อาจทำให้เข้าใจผิด ฉันแทนที่ด้วย "ข้อความย่อยที่เหมาะสม" ฟังก์ชั่นการแยกย่อยข้อความนั้นใช้เวลานานกว่าทำให้เกิดการชนกันโดยไม่ตั้งใจดังนั้นจึงไม่น่าจะสันนิษฐานได้ว่าเป็นไปไม่ได้สำหรับการใช้งานจริง
ฟิลิปป์

2
มันพยายามที่จะทำให้แน่ใจว่าข้อความจะไม่เปลี่ยนแปลง แต่การตรวจสอบที่ใช้ใน UDP ค่อนข้างอ่อนแอ ในขณะที่โอกาสของข้อความสุ่มที่มีการตรวจสอบที่ถูกต้องนั้นแท้จริงแล้วคือ 1 ใน 65536 สำหรับการตรวจสอบทั้งหมด 16 บิตมาตรการที่มีประโยชน์มากขึ้นเกี่ยวข้องกับการตรวจสอบจำนวนบิตของการพลิกบิตที่ตรวจพบได้ทั้งแบบสุ่ม การวัดนี้
Ben Voigt

1
@AProgrammer Cryptographic hASH (MD5, SHA-1/2/3, ... ) ตั้งเป้าว่าจะถูกที่สุดเท่าที่จะเป็นไปได้ในขณะที่มั่นใจในคุณสมบัติความปลอดภัยเช่นการต้านทานการชน โดยทั่วไปแล้วพวกเขาสามารถประมวลผลหลายร้อย MB ต่อวินาทีดังนั้นพวกเขาจึงไม่ควรเป็นคอขวดสำหรับทุกสิ่งที่น้อยกว่าการเชื่อมต่อ Gbit พวกเขายังช้ากว่าหลายคนที่ไม่ได้เข้ารหัสลับซึ่งไม่จำเป็นต้องต้านทานการชนกัน แฮชรหัสผ่านเท่านั้น(PBKDF2, bcrypt, scrypt, Argon, ... ) มีเป้าหมายที่จะคำนวณราคาแพง
CodesInChaos

12

อย่างไรก็ตาม UDP มีการตรวจสอบอย่างไรก็ตาม

  1. การตรวจสอบ UDP เพียง 16 บิต นั่นหมายถึงโอกาส 1 ใน 65536 ของแพ็กเก็ตที่เสียหายผ่านการตรวจสอบ
  2. ใน UDP ผ่าน IPv4 การตรวจสอบเป็นตัวเลือกดังนั้นผู้ส่งในทางทฤษฎีจึงสามารถส่งแพ็กเก็ตได้โดยไม่ต้องมีการตรวจสอบ
  3. การตรวจสอบครอบคลุมข้อมูล IP / พอร์ตเช่นเดียวกับข้อมูล แม้ว่าสิ่งนี้มีประโยชน์ในการทิ้งแพ็กเก็ตที่มีแอดเดรสที่เสียหายหมายความว่าถ้าแพ็กเก็ตผ่าน NAT การตรวจสอบจะต้องถูกคำนวณใหม่โดย NAT
  4. การตรวจสอบจะปกป้องข้อมูลในขณะที่เดินทางในแพ็คเก็ต UDP เท่านั้น การตรวจสอบระดับแอปพลิเคชันสามารถป้องกันการสิ้นสุดของข้อมูลได้เมื่อมันผ่านระบบที่ซับซ้อนมากขึ้น
  5. การตรวจสอบ UDP จะบอกคุณว่าแพ็คเก็ตนั้นสร้างขึ้นโดยการนำ UDP ไปใช้เท่านั้น ไม่ได้บอกคุณว่ามาจากเซ็นเซอร์ของคุณ การตรวจสอบระดับแอปพลิเคชันในทางกลับกันอาจช่วยปฏิเสธแพ็กเก็ตที่เป็น UDP ที่ถูกต้อง แต่มาจากแหล่งอื่น

ดังนั้นฉันสามารถเห็นเหตุผลที่ถูกต้องตามกฎหมายที่ไม่ไว้วางใจการตรวจสอบ UDP แต่อย่างเท่าเทียมกันไม่น่าเชื่อถือการตรวจสอบ UDP และจากนั้นการใช้การตรวจสอบที่อ่อนแอคล้ายกันที่ระดับสมัครดูเหมือนว่าแปลก

มีความเป็นไปได้ที่บุคคลที่อ้างถึงโปรโตคอลก็ไม่ทราบว่า UDP ให้เช็คซัมหรือว่าโปรโตคอลนั้นเป็นตัวแปรที่แตกต่างกันเล็กน้อยของหนึ่งที่ออกแบบมาเพื่อทำงานบนสื่อที่ไม่ได้ให้ checksums

ป.ล. เนื่องจากโพสต์นี้ได้รับการติดแท็กด้านความปลอดภัยโปรดทราบว่าการตรวจสอบที่มีปัญหาถูกออกแบบมาเพื่อป้องกันการเปลี่ยนแปลงที่ไม่ได้ตั้งใจ การป้องกันการดัดแปลงโดยเจตนาหรือการปลอมแปลงจำเป็นต้องใช้ทั้งฟังก์ชันแฮชการเข้ารหัสที่ทนต่อการชน / การ preimages และการใช้กลไกบางอย่าง (เช่นลายเซ็นที่ใช้รหัสสาธารณะ) เพื่อตรวจสอบว่าตัวเองแฮชไม่ได้ถูกแก้ไข

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.